c# - List<T>.AsReadOnly() 与 IReadOnlyCollection<T>

标签 c# generics collections

List<T>工具 IReadOnlyCollection<T>接口(interface)并提供AsReadOnly()返回 ReadOnlyCollection<T> 的方法(它又实现了 IReadOnlyCollection<T> )。

AsReadyOnly() 的用途/原因是什么? ?它的存在有一种或两种极端情况的味道,其中只是将列表返回为 IReadOnlyCollection<T>。只是不够好。

起初我认为这可能是为了防止放弃成本,但看起来你可以用 ReadOnlyCollection<T> 做到这一点的 Items访问器(accessor)。

顺便说一句。 ReadOnlyCollection<T> 的文档类型阅读

Provides the base class for a generic read-only collection.

在我看来,这与将构造函数描述为

相冲突

Initializes a new instance of the (...) class that is a read-only wrapper around the specified list.

更新: 我没看到 ReadOnlyCollection<T>Items受到保护。

最佳答案

如果你只是返回一个实际的 List<T>作为IReadOnlyList<T> ,那么调用者总是可以将其转换回去,然后根据需要修改列表。相反,调用 AsReadOnly()创建列表的只读包装器,消费者无法更新。

请注意,只读包装器将反射(reflect)对基础列表所做的更改,因此可以访问原始列表的代码仍然可以在知道只读版本的任何消费者都将看到这些更改的情况下更新它。

关于c# - List<T>.AsReadOnly() 与 IReadOnlyCollection<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398428/

相关文章:

c# - winsock 资源不足

c# - 使用接口(interface)实例调用泛型方法

java - 如何在 Java 中将 Java 集合转换为 Kotlin 序列(反之亦然)?

java - java中Stack和Queue的内存是如何分配的

c# - ReSharper 9.2 为具有事件名称的 nameof 生成警告

c# - 在后台进行 UI 工作

c# - 比较类型是否可为空

java - map 与泛型的递归合并

c++ - 为成对容器的第一个元素提供迭代器

java - 继承和覆盖同步方法