我在公共静态类中有以下代码:
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不会这样做
答案 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方法,它返回一个只读列表应该是你想要的。