readonly关键字不会生成List<>只读?

时间:2012-04-08 21:31:41

标签: c# list collections

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

public static class MyList
{
    public static readonly SortedList<int, List<myObj>> CharList;
    // ...etc.
}

..但即使使用readonly,我仍然可以从其他类添加项目到列表中:

MyList.CharList[100] = new List<myObj>() { new myObj(30, 30) };

MyList.CharList.Add(new List<myObj>() { new myObj(30, 30) });

有没有办法让事物只读而不改变CharList的实现(它会打破一些东西)? 如果我必须改变实现(使其不可更改),那么最好的方法是什么? 我需要它是List&lt; T,T&gt;,所以ReadOnlyCollection不会这样做

3 个答案:

答案 0 :(得分:42)

修饰符readonly表示除了声明或构造函数之外,该值不能分配意味着分配的对象变为不可变。

如果希望对象是不可变的,则必须使用不可变的类型。您提到的类型ReadOnlyCollection<T>是不可变集合的示例。有关如何为词典实现相同的内容,请参阅此相关问题:

答案 1 :(得分:3)

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

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设为私有,并添加您自己的方法来控制对它的访问:

class MyList
{
    // private now
    readonly SortedList<int, List<myObj>> CharList;

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

答案 2 :(得分:1)

List具有AsReadOnly方法,它返回一个只读列表应该是你想要的。