根据 FxCop 的建议和我个人的意愿,我一直在鼓励我所指导的团队尽可能多地使用 ReadOnlyCollections。如果只是为了让列表的收件人无法修改其内容。在他们的理论中,这就是面包和黄油。问题是 List<> 接口(interface)更加丰富,暴露了各种有用的方法。他们为什么做出这样的选择?
你只是放弃并返回可写集合吗?您是否返回只读集合,然后将它们包装在可写集合中?啊啊啊。
更新: 谢谢,我熟悉框架设计指南,这就是团队使用 FxCop 来强制执行它的原因。然而,这个团队使用 VS 2005(我知道,我知道),所以告诉他们 LINQ/Extension 方法可以解决他们的问题只会让他们难过。
他们了解到 List.FindAll() 和 .FindFirst() 比编写 foreach 循环更清晰。现在我正在插入他们使用 ReadOnlyCollections,他们失去了那种清晰度。
也许存在我没有发现的更深层次的设计问题。
-- 对不起,原来的帖子应该提到 VS2005 的限制。我已经生活了很长时间,以至于我没有注意到。
最佳答案
.NET Framework Design Guidelines Second Edition 的第 8.3.2 节:
DO use
ReadOnlyCollection<T>
, a subclass ofReadOnlyCollection<T>
, or in rare casesIEnumerable<T>
for properties or return values representing read-only collections.
我们使用 ReadOnlyCollections 来表达我们对返回集合的意图。
List<T>
为方便起见,您所说的方法已添加到 .NET 2.0 中。在 C# 3.0/.NET 3.5 中,您可以在 ReadOnlyCollection<T>
上恢复所有这些方法(或任何 IEnumerable<T>
)使用扩展方法(并使用 LINQ 运算符),所以我认为没有任何动机将它们本地添加到其他类型。它们存在于 List 上的事实只是一个历史记录,因为扩展方法现在可用但在 2.0 中不存在。
关于c# - 为什么 ReadOnlyCollection<> 不包含 FindAll()、FindFirst()、,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921511/