根据FxCop的建议和我个人的倾向,我一直鼓励我正在指导的团队尽可能多地使用ReadOnlyCollections。仅限于列表的收件人无法修改其内容。在他们的理论中,这是面包&牛油。问题是List<>界面更加丰富,暴露出各种有用的方法。他们为什么选择这个?
你是否放弃并归还可写集合?您是否返回只读集合,然后将它们包装在可写的多样性中? AHHHHH。
更新: 谢谢我熟悉框架设计指南,这就是为什么团队使用FxCop来强制执行它。然而这个团队和VS 2005一起生活(我知道,我知道)并告诉他们LINQ / Extension方法可以解决他们的问题只会让他们感到难过。
他们已经了解到List.FindAll()和.FindFirst()比编写foreach循环更清晰。现在我推动他们使用ReadOnlyCollections,他们失去了清晰度。
也许有一个我没有发现的更深层次的设计问题。
- 抱歉,原帖应该提到VS2005限制。我和我共处了很长时间以至于我没有注意到。
答案 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中使用ArrayList
或List<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。