c# – IsReadOnly是否禁止您在内部更改自定义IList对象?

前端之家收集整理的这篇文章主要介绍了c# – IsReadOnly是否禁止您在内部更改自定义IList对象?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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执行此操作?

如果允许内部修改,这是否意味着期望具有IsReadOnly的IList永远不会改变的代码本身就会被破坏?

如果不允许内部修改,这是否意味着无法编写可在内部更改的有效IList,但不允许用户修改它?

解决方法

https://msdn.microsoft.com/en-us/library/cc645181%28v=vs.110%29.aspx

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>的内部类型.它被创建为一个新数组的包装器,在构造上复制,因此没有其他任何东西可以改变它.该类型被信任永不改变,因此可以在使用之间共享,但所有其他情况则不然.

猜你在找的C#相关文章