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

时间:2009-05-28 15:31:47

标签: c# collections readonly-collection

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

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


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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

话虽如此,你最初的问题引导我提出一些建议......

返回List<T>是糟糕的设计,所以它不应该是一个比较点。 List<T>应该用于实现,但是对于接口,应该返回IList<T>Framework Design Guidelines特别声明:

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

如果考虑到这一点,与ReadOnlyCollection<T>相比,List<T>绝对没有任何劣势。这两个类都实现了IEnumerable<T>IList<T>,它们是应该返回的接口。

答案 1 :(得分:6)

.NET Framework Design Guidelines Second Edition的第8.3.2节:

  

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

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

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

答案 2 :(得分:3)

我对他们最初没有加入的原因我没有任何见解。但是现在我们有了LINQ,我当然没有理由在未来的语言版本中添加它们。您提到的方法今天可以很容易地在LINQ查询中编写。这些天我只使用LINQ查询几乎所有东西。实际上,我经常对List<T>使用这些方法感到恼火,因为它与我针对IEnumerable<T>编写的扩展方法相冲突。

答案 3 :(得分:0)

我认为杰夫的回答有点包含你需要的答案;而不是ReadOnlyCollection<T>,返回它的子类...您自己实现的一个子类包含您想要使用的方法而不升级到VS2008 / LINQ。