首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readonly关键字不会生成List<> ReadOnly?

readonly关键字不会生成List<> ReadOnly?
EN

Stack Overflow用户
提问于 2012-04-09 05:31:41
回答 3查看 15.6K关注 0票数 29

我在一个公共静态类中有以下代码:

代码语言:javascript
复制
public static class MyList
{
    public static readonly SortedList<int, List<myObj>> CharList;
    // ...etc.
}

。。但即使使用readonly,我仍然可以将其他类中的项添加到列表中:

代码语言:javascript
复制
MyList.CharList[100] = new List<myObj>() { new myObj(30, 30) };

代码语言:javascript
复制
MyList.CharList.Add(new List<myObj>() { new myObj(30, 30) });

有没有一种方法可以在不改变CharList的实现的情况下只读东西(这会破坏一些东西)?如果我必须更改实现(使其不可更改),那么最好的方法是什么?我需要它是List,这样ReadOnlyCollection就不能用了

EN

回答 3

Stack Overflow用户

发布于 2012-04-09 05:34:32

修饰符readonly表示不能赋值,除非在声明或构造函数中。这并不意味着指定的对象变得不可变。

如果希望对象是不可变的,则必须使用不可变的类型。您提到的ReadOnlyCollection类型是不可变集合的一个示例。请参阅此相关问题,了解如何在字典中实现相同的目标:

票数 54
EN

Stack Overflow用户

发布于 2012-04-09 05:43:15

只读修饰符只是保证变量'CharList‘不能从类构造函数外部重新赋值给其他变量。您需要创建自己的没有公共Add()方法的字典结构。

代码语言:javascript
复制
class ImmutableSortedList<T, T1> 
{
    SortedList<T, T1> mSortedList;

    public ImmutableSortedList(SortedList<T, T1> sortedList) // can only add here (immutable)
    {
        this.mSortedList = sortedList; 
    }

    public implicit operator ImmutableSortedList<T, T1>(SortedList<T, T1> sortedList)
    {
        return new ImmutableSortedList<T, T1>(sortedList); 
    }
}

或者,如果您确实不能更改实现,请将SortedList设置为私有,并添加您自己的方法来控制对它的访问:

代码语言:javascript
复制
class MyList
{
    // private now
    readonly SortedList<int, List<myObj>> CharList;

    // public indexer
    public List<myObj> this[int index]
    {
        get { return this.CharList[index]; }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-04-09 05:39:14

具有返回只读列表的AsReadOnly方法的列表应该是您想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10066708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档