如何使用只读修饰符的集合在C#中可以修改?

时间:2013-12-18 14:19:37

标签: c# collections

在下面的代码中,即使集合声明为readonly,我们也可以将项目添加到集合中。但是已知的事实如readonly修饰符将允许在声明,初始化表达式或构造函数中初始化值。 以下是如何实现的? readonly修饰符在不同类型上的行为方式?

class Program
{
    static void Main(string[] args)
    {
        ReadonlyStringHolder stringHolder = new ReadonlyStringHolder();
        stringHolder.Item = "Say Hello";//compile time error-Read only field cannot be initialized to

        ReadOnlyCollectionHolder collectionHolder = new ReadOnlyCollectionHolder();
        collectionHolder.ItemList.Add("A");
        collectionHolder.ItemList.Add("B");//No Error -How Is possible for modifying readonly collection

        Console.ReadKey();
    }
}

public class ReadOnlyCollectionHolder
{
    public readonly IList<String> ItemList = new List<String>();
}
public class ReadonlyStringHolder
{
    public readonly String Item = "Hello";
}

2 个答案:

答案 0 :(得分:2)

改为使用ReadOnlyCollection

readonly不允许仅更改实例(构造函数除外)

public class ReadOnlyCollectionHolder
{
    private List<string> _innerCollection=new List<string>();

    public ReadOnlyCollectionHolder()
    {
        ItemList = new ReadOnlyCollection<String> (_innerCollection);
    }

    public readonly ReadOnlyCollection<String> ItemList {get;private set;}
}

答案 1 :(得分:1)

您无法更改ItemList实例,但可以调用其方法。 如果您真的想要一个只读列表,则应考虑使用IReadOnlyList<T>ReadOnlyCollection<T>