我在一个公共静态类中有以下代码:
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,这样ReadOnlyCollection就不能用了
发布于 2012-04-09 05:34:32
修饰符readonly表示不能赋值,除非在声明或构造函数中。这并不意味着指定的对象变得不可变。
如果希望对象是不可变的,则必须使用不可变的类型。您提到的ReadOnlyCollection类型是不可变集合的一个示例。请参阅此相关问题,了解如何在字典中实现相同的目标:
发布于 2012-04-09 05:43:15
只读修饰符只是保证变量'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]; }
}
}发布于 2012-04-09 05:39:14
具有返回只读列表的AsReadOnly方法的列表应该是您想要的。
https://stackoverflow.com/questions/10066708
复制相似问题