tym*_*tam 39 c# generics collections
List<T>实现IReadOnlyCollection<T>接口并提供AsReadOnly()返回的方法ReadOnlyCollection<T>(进而实现IReadOnlyCollection<T>).
用途/原因是AsReadyOnly()什么?它的存在气味有一两个边缘情况,只是将列表返回为IReadOnlyCollection<T>它不够好.
起初,我虽然它可能是防止铸造成本岬遥远,但它看起来像你可以做到这一点ReadOnlyCollection<T>的Items存取器.
BTW.ReadOnlyCollection<T>类型读取的文档
提供通用只读集合的基类.
在我的脑海中,与描述为的构造函数冲突
初始化(...)类的新实例,它是指定列表周围的只读包装器.
更新:
我没有看到ReadOnlyCollection<T>的Items是受保护的.
dle*_*lev 48
如果您只是返回一个实际List<T>的IReadOnlyList<T>,那么调用者总是可以将其强制转换,然后根据需要修改列表.相反,调用AsReadOnly()会创建列表的只读包装,消费者无法更新.
请注意,只读包装器将反映对基础列表所做的更改,因此可以访问原始列表的代码仍然可以更新它,并且知道只读版本的任何使用者都将看到这些更改.
Imm*_*rth 24
首先,它并没有AsReadOnly()被添加,因为它还IReadOnlyList<T>不够好 - IReadOnlyList<T>仅从.NET 4.5开始,而AsReadOnly()自.NET 2以来存在方法.
更重要的是:AsReadOnly()和IReadOnlyList<T>服务有不同的用途.
ReadOnlyCollection<T>用于实现对象模型,例如Dictionary<K,V>.Keys和Dictionary<K,V>.Values.这适用于消费者不能在生产者可以改变内容的情况.它协同工作Collection<T>,为所有者提供钩子,以便在添加项目时验证更改或执行副作用.
IReadOnlyList<T>另一方面,它只是一个提供集合的只读视图的接口.方法可以使用它来说"我需要一个随机访问集合,但我不需要能够修改它".例如,BinarySearch方法可能如下所示:
public int BinarySearch<T>(IReadOnlyList<T> list, int start, int length);
Run Code Online (Sandbox Code Playgroud)
为了使此方法有用,需要能够传入任何List.强制创建包装器集合将非常昂贵.