c# – IsReadOnly是否禁止您在内部更改自定义IList对象?
IList.IsReadOnly 的备注声明如下:
这是否意味着实现IList的自定义类无法在内部添加或删除元素,或者它是否仅禁止用户使用接口mothods执行此操作? 如果允许内部修改,这是否意味着期望具有IsReadOnly的IList永远不会改变的代码本身就会被破坏? 如果不允许内部修改,这是否意味着无法编写可在内部更改的有效IList,但不允许用户修改它? 解决方法
https://msdn.microsoft.com/en-us/library/cc645181%28v=vs.110%29.aspx
对于另一种类型,没有什么可以阻止你暴露真正不可变的集合作为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>的内部类型.它被创建为一个新数组的包装器,在构造上复制,因此没有其他任何东西可以改变它.该类型被信任永不改变,因此可以在使用之间共享,但所有其他情况则不然. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |