为什么在.NET 4.5中,List 实现了 IReadOnlyList?
List 不是只读的...
List 不是只读的...
List<T>
实现了IReadOnlyList<T>
的所有必要方法/属性等(甚至更多)。接口是一种合同,表示“我至少可以做这些事情。”
没错。在该接口中没有变异器方法。这就是只读的含义,对吧?
IReadOnlyList<T>
的文档说它表示一个只读元素集合。
IReadOnlyList<T>
以“典型”的(合同)方式使用,而不是作为marker。IList
的 IsReadOnly
属性正确地应用了这个术语,当读取和写入均可行时,该属性值为 false
。这个接口应该被命名为类似于 IIndexable
的名称。 - nmclean接口只描述将要实现的功能。它不描述将不会实现的功能。因此,IReadOnlyList是一个不正确的接口名称,因为它不能指定写功能不会被编写。
这些方法/函数描述您可以读取列表的内容。接口应该为IReadableList而不是IReadOnlyList。
IReadOnlyList
和 IReadOnlyCollection
有点令人困惑,因为它们并不意味着集合是只读的,而是支持只读访问。请参阅MSDN文档(向下滚动到“备注”部分)。
更好的名字应该是列表元素的内容不能保证是只读的。
IReadable
,请参阅 为什么泛型 ICollection
在 .NET 4.5 中没有实现 IReadOnlyCollection
?。此外,这意味着 IList
应该继承 IReadOnlyList
,尽管由于向后兼容性而未继承,详见 为什么 IList<T>
没有继承自 IReadOnlyList<T>
?。难道不是这样吗?运行IReadOnlyList(Of T)调用实现该接口的对象的代码通常在同一执行线程上运行。这可以防止对象被自身修改,除非它在不同的执行线程上运行,但对于这种情况,我们有同步调用来解决这个问题。