IList.IsReadOnly
的备注声明如下:
A collection that is read-only does not allow the addition,removal,or modification of elements after the collection is created.
这是否意味着实现IList的自定义类无法在内部添加或删除元素,或者它是否仅禁止用户使用接口mothods执行此操作?
解决方法
A collection that is read-only is simply a collection with a wrapper that prevents modifying the collection; therefore,if changes are made to the underlying collection,the read-only collection reflects those changes.
对于另一种类型,没有什么可以阻止你暴露真正不可变的集合作为IList< T>该属性返回true,但您不必.
我们还可以看到框架库中为IsReadOnly返回true的情况通常允许对内部集合进行变异.
List<int> initialList = new List<int> { 1 }; IList<int> readOnly = new ReadOnlyCollection<int>(initialList); Console.WriteLine(readOnly.Count); // 1 Console.WriteLine(readOnly.IsReadOnly); // True initialList.Add(2); Console.WriteLine(readOnly.Count); // 2
实际上,IsReadOnly告诉你像Add这样的变异方法和索引器的setter方法都会失败,而不是通过各种方式对象是不可变的.
在这方面一个有趣的考虑因素:框架库中的某些地方本身需要只读列表,这些列表确实是真正的只读.它们的公共接口返回ReadOnlyCollection< T>或IReadOnlyList< T> (例如,BlockExpression.Expressions返回ReadOnlyCollection< T>)但它们不信任传递给它们的只读集合.它们使用名为TrueReadOnlyCollection< T>的内部类型.它被创建为一个新数组的包装器,在构造上复制,因此没有其他任何东西可以改变它.该类型被信任永不改变,因此可以在使用之间共享,但所有其他情况则不然.