为什么ReadOnlyCollection <>包含FindAll(),FindFirst()等方法,

Mar*_*son 6 c# collections readonly-collection

根据FxCop的建议和我个人的倾向,我一直鼓励我正在指导的团队尽可能多地使用ReadOnlyCollections.仅限于列表的收件人无法修改其内容.在他们的理论中,这是面包和黄油.问题是List <>接口更丰富,暴露了各种有用的方法.他们为什么做出这个选择?

你只是放弃并返回可写的集合吗?您是否返回只读集合,然后将它们包装在可写的多样性中?AHHHHH.


更新:谢谢我熟悉框架设计指南,这就是为什么团队使用FxCop来强制执行它.然而,这个团队和VS 2005一起生活(我知道,我知道)并告诉他们LINQ/Extension方法可以解决他们的问题只会让他们感到难过.

他们已经了解到List.FindAll()和.FindFirst()比编写foreach循环更清晰.现在我正在推动他们使用ReadOnlyCollections,他们失去了清晰度.

也许有一个更深层次的设计问题,我没有发现.

- 抱歉,原帖应该提到了VS2005的限制.我和我共处了很长时间以至于我没有注意到.

Ree*_*sey 7

首先,ReadOnlyCollection<T>确实实施IEnumerable<T>IList<T>.使用.NET 3.5和LINQ中的所有扩展方法,您可以List<T>在查询方面访问原始类中的几乎所有功能,ReadOnlyCollection<T>无论如何都应该这样做.

话虽这么说,你最初的问题让我提出一些建议......

返回List<T>是糟糕的设计,所以它不应该是一个比较点. List<T>应该用于实现,但对于接口,IList<T>应该返回.该框架设计指南具体说明:

" 不要使用ArrayListList<T>在公共API中使用." (第251页)

如果你考虑到这一点,与之ReadOnlyCollection<T>相比绝对没有缺点List<T>.这两个类的实现IEnumerable<T>IList<T>,这是应该反正返回的接口.


Jef*_*ser 6

.NET Framework设计指南第二版的第8.3.2节:

DO使用ReadOnlyCollection<T>,子类ReadOnlyCollection<T>,或在极少数情况下IEnumerable<T>使用表示只读集合的​​属性或返回值.

我们使用ReadOnlyCollections来表达我们返回的集合的意图.

List<T>为方便起见,您在.NET 2.0中添加了您所说的方法.在C#3.0/.NET 3.5中,您可以使用扩展方法(以及使用LINQ运算符)重新获得所有这些方法ReadOnlyCollection<T>(或者IEnumerable<T>使用LINQ运算符),因此我认为没有任何动机将它们本地添加到其他类型.它们在List上存在的事实只是一个历史记录,因为现在可以使用扩展方法,但不是2.0.

  • 可悲的是,这支球队陷入了2.0的时间扭曲. (2认同)