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>以"典型"(契约)方式使用,而不是作为标记.
小智 24
接口仅描述将要实现的功能.它没有描述不会实现的功能.因此,IReadOnlyList是一个不正确的接口名称,因为它不能指示不写入写入功能.
描述的方法/功能可以读取列表的内容.接口应该是IReadableList而不是IReadOnlyList.
实现接口与"标记"不同.List<T>也实现了IEnumerable<T>,但这并不意味着你只能简单地枚举它.
他们为API创建添加了只读接口,而不是用标记只读类型的接口.IReadOnlyCollection<T>当我只想知道集合中元素的数量而不枚举它时,或者IReadOnlyList<T>当我需要通过索引引用集合中的元素时,它允许我使用参数.这对每个人都有好处 - 我可以具体说明我的调用者需要什么,同时允许我的调用者使用他想要的任何集合类型,只要它符合我通过参数类型设置的最低标准.
所以我认为更难的问题是,你为什么不List<T>实施IReadOnlyList<T>?
接口IReadOnlyList和IReadOnlyCollection有点令人困惑,因为它们并不意味着集合是只读的,只是支持读取访问。这是因为接口无法确定哪些功能不会被编写;它只能说明支持哪些功能。
更好的名称是IReadable,请参阅为什么泛型在 .NET 4.5 中不ICollection实现?IReadOnlyCollection。此外,这意味着IList应该继承IReadOnlyList,尽管由于向后兼容性而没有继承,请参阅为什么不IList<T>继承自IReadOnlyList<T>?。
它实现接口的事实并不意味着它是只读的.但是因为它实现了接口,所以现在可以将它传递给期望的方法IReadOnlyList<T>.所以看待它的方法是,它实现了只读列表接口......以及一些写入方法.
| 归档时间: |
|
| 查看次数: |
8709 次 |
| 最近记录: |