在下面的代码中,即使集合声明为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";
}
答案 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>