为什么List <T>在.NET 4.5中实现IReadOnlyList <T>?

Jam*_*ing 37 .net base-class-library .net-4.5

为什么在.NET 4.5 中List<T>实现IReadOnlyList<T>

List<T> 不是只读的......

Mat*_*all 40

因为List<T>实现了所有必要的方法/属性/等.(然后是一些)IReadOnlyList<T>.界面是一份合同,上面写着"我至少可以做这些事情."

它的文档IReadOnlyList<T>说它代表了一个只读的元素集合.

那就对了.该接口中没有mutator方法.这就是只读的意思,对吗?IReadOnlyList<T>以"典型"(契约)方式使用,而不是作为标记.

  • 该接口不保证无法修改列表.它只是意味着你无法通过界面修改它. (34认同)
  • 好的,这个逻辑不应该IList <T>实现IReadOnlyList <T>?我认为这很愚蠢. (11认同)
  • 这应该!但它不能,因为它将是一个突破性的变化.阅读我之前提供的链接. (6认同)
  • *"这就是只读的意思,对吧?"* - 嗯,不.我不是律师,但我相当确定**only*的内容与****的内容非常不同.该术语在`IList`的`IsReadOnly`属性中正确应用,当读*和*写时可以是'false`.界面应该命名为`IIndexable`. (6认同)
  • 对于从OO编程开始,对类型和子类型关系的"是"解释是有用的.然而,它并不是很正确. (3认同)
  • 下面是对IReadOnly接口一个有趣的阅读... http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b4fb991a-3f5c-4923-93d4-7cd5c004f859 (2认同)
  • @JamesNewton-King 当然,在理想的世界中,遗留代码和向后兼容性不成问题,这是有意义的。但在现实世界中,这将是一个突破性的变化。[你不是第一个想到它的人。](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2845892-make-ilist-t-inherited-from-ireadonlylist-t -) 良好的 API 设计很难。完美的API设计是不可能的。第一次就把事情做好更是不可能的。 (2认同)
  • @JamesNewton-King:.NET包含一个`IImmutableList <T>`会很有用,它只能由不可变集合实现[不一定是数组支持的集合; 从`IEnumerable <int>返回.Range`可以通过让索引器按需计算第n个元素的值来实现`IImmutableList <int>`. (2认同)
  • @MattBall是的,这很有道理,谢谢.如果这个名字有用的话会很好的.也许IReadableList而不是IReadOnly (2认同)

小智 24

接口仅描述将要实现的功能.它没有描述不会实现的功能.因此,IReadOnlyList是一个不正确的接口名称,因为它不能指示不写入写入功能.

描述的方法/功能可以读取列表的内容.接口应该是IReadableList而不是IReadOnlyList.

  • 我同意; 这个名字的"唯一"部分令人不安. (8认同)

Dav*_*rtz 6

实现接口与"标记"不同.List<T>也实现了IEnumerable<T>,但这并不意味着你只能简单地枚举它.

他们为API创建添加了只读接口,而不是用标记只读类型的接口.IReadOnlyCollection<T>当我只想知道集合中元素的数量而不枚举它时,或者IReadOnlyList<T>当我需要通过索引引用集合中的元素时,它允许我使用参数.这对每个人都有好处 - 我可以具体说明我的调用者需要什么,同时允许我的调用者使用他想要的任何集合类型,只要它符合我通过参数类型设置的最低标准.

所以我认为更难的问题是,你为什么List<T>实施IReadOnlyList<T>


Mar*_*air 6

接口IReadOnlyListIReadOnlyCollection有点令人困惑,因为它们并不意味着集合是只读的,只是支持读取访问。这是因为接口无法确定哪些功能不会编写;它只能说明支持哪些功能。

更好的名称是IReadable,请参阅为什么泛型在 .NET 4.5 中ICollection实现?IReadOnlyCollection。此外,这意味着IList应该继承IReadOnlyList,尽管由于向后兼容性而没有继承,请参阅为什么不IList<T>继承自IReadOnlyList<T>


Bra*_*don 5

它实现接口的事实并不意味着它是只读的.但是因为它实现了接口,所以现在可以将它传递给期望的方法IReadOnlyList<T>.所以看待它的方法是,它实现了只读列表接口......以及一些写入方法.