29

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

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<T, T>,所以 ReadOnlyCollection 不会做

4

3 回答 3

55

修饰符readonly意味着只能在声明或构造函数中分配值。这并不意味着分配的对象变得不可变。

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

于 2012-04-08T21:34:32.260 回答
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]; }
    }
}
于 2012-04-08T21:43:15.210 回答
1

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

于 2012-04-08T21:39:13.983 回答