readonly关键字不会使List ReadOnly?

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

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

..但即使使用readonly我仍然可以从另一个类添加项目到列表:

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

要么

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

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

修饰符readonly意味着除了声明或构造函数之外,不能赋值 。 这并不意味着分配的对象变得不可变。

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

  • .NET中是否有只读的通用字典?

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

 class ImmutableSortedList { SortedList mSortedList; public ImmutableSortedList(SortedList sortedList) // can only add here (immutable) { this.mSortedList = sortedList; } public implicit operator ImmutableSortedList(SortedList sortedList) { return new ImmutableSortedList(sortedList); } } 

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

 class MyList { // private now readonly SortedList> CharList; // public indexer public List this[int index] { get { return this.CharList[index]; } } } 

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