为什么不ReadOnlyCollection<>包括的方法如FindAll(),FindFirst(),
-
06-09-2019 - |
题
以下的建议FxCop和我个人的倾向,我已经鼓励团队我是教练使用ReadOnlyCollections多可能的。如果仅使收件人的名单也不能修改它们的内容。在他们的理论,这是面包和黄油。问题是,名单<>界是丰富得多露出各种有用的方法。为什么他们作出这样的选择吗?
你只是得到了与返回可写入集合?你只读回收藏,然后将它们包装在写各种?啊哈.
更新:谢谢我很熟悉该框架的设计准则,这就是为什么团队使用FxCop到执行。但是这个团队是生活与VS2005年(我知道,我知道),那么,告诉他们,皇宫/扩展的方法,将解决他们的问题只是让他们的悲伤。
他们已经了解到,名单。FindAll()and。FindFirst()提供更大的清晰度超过编写foreach循环。现在我将他们推向使用ReadOnlyCollections他们失去了清晰度。
也许还有更深层的设计问题,我没有血斑。
-对不起,原来的职位应该提到的VS2005限制。我已经住在一起这么久,我只是不另行通知。
解决方案
第8.3.2的 .净框架的设计准则,第二版:
做 使用
ReadOnlyCollection<T>
, 子类ReadOnlyCollection<T>
, 或者在极少数情况下IEnumerable<T>
对于性质或返回值表示的只读的集合。
我们去ReadOnlyCollections表达我们的意图集的返回。
的 List<T>
方法你说的加入。网2.0的方便。C#3.0/.净3.5,你可以得到所有这些方法的背上 ReadOnlyCollection<T>
(或者任何 IEnumerable<T>
)采用扩展的方法(和使用皇宫运作),因此我不认为有任何动机增加他们本身的其他类型。事实上,他们存在的所有在名单仅仅是一个历史注意,由于存在扩展的方法可用,但现在不是在2.0.
其他提示
首先,ReadOnlyCollection<T>
确实实现IEnumerable<T>
和IList<T>
。与所有的.NET中的3.5和LINQ的扩展方法,您可以访问几乎所有的从原来的List<T>
类的功能在查询方面,这是你应该用ReadOnlyCollection<T>
闲着。
话虽这么说,你最初的问题导致我提出一些建议......
返回List<T>
是不好的设计,因此它不应该是比较点。 List<T>
应当用于实现,但对于接口,应返回IList<T>
。的框架设计准则具体状态:
“的 DO NOT 使用ArrayList
或List<T>
在公共API”。 (页251)
如果你考虑到这一点,没有绝对的缺点相比,ReadOnlyCollection<T>
时List<T>
。这两个类实现IEnumerable<T>
和IList<T>
,这是应当反正返回的接口。
我没有任何见解,为什么他们最初没有加入。但是现在我们有LINQ我当然没有理由增加他们在未来的版本中。你提到的方法可以很容易地在LINQ查询今天被写入。这些天,我只是使用LINQ查询的几乎一切。其实,我更多的时候得到恼火有那些方法List<T>
,因为它与扩展方法,我写反IEnumerable<T>
冲突。
我想杰夫的回答还挺包含你所需要的答案;而不是ReadOnlyCollection<T>
,返回它的一个子类......一个你自己实现,包括你想不升级到VS2008 / LINQ使用的方法。