以下的建议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 使用ArrayListList<T>在公共API”。 (页251)

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

我没有任何见解,为什么他们最初没有加入。但是现在我们有LINQ我当然没有理由增加他们在未来的版本中。你提到的方法可以很容易地在LINQ查询今天被写入。这些天,我只是使用LINQ查询的几乎一切。其实,我更多的时候得到恼火有那些方法List<T>,因为它与扩展方法,我写反IEnumerable<T>冲突。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top