'不公开通用列表',为什么在方法参数中使用集合<t>而不是list <t> </t> </t>

时间:2013-05-29 06:18:13

标签: c# generics collections

我正在使用FxCop并显示“请勿公开通用列表”的警告,建议使用Collection<T>而不是List<T>。之所以如此,我知道所有这些内容,如this SO postMSDN中提到的以及我经历过的更多文章。

但是我的问题是,我有很少的方法可以进行如此繁重的计算,并且方法接受List<T>的参数,这些参数在性能方面应该更快更好。但是,FxCop也会对此发出警告。所以一个选项是我应该将参数声明为Collection<T>,然后在方法中使用ToList()然后使用它。

那么哪一个被优化了?

“取消对此案例的警告”“在参数中使用Collection<T>,然后在方法本身内使用ToList()”。

4 个答案:

答案 0 :(得分:15)

编写代码分析/ FxCop规则是为了支持框架创建者(Microsoft创建了许多框架)。外部方使用框架,在设计公共接口时应该小心。如果您没有编写供外部各方使用的框架,您可以简单地忽略不会为您提供价值的规则。

但是,存在此规则的原因之一是在类上公开集合有点困难。通常,集合中的元素由包含类拥有,在这种情况下,如果允许客户端修改用于存储聚合项的集合,则会违反封装。通过返回List<T>,您允许客户端以多种不同方式修改集合。但通常你想跟踪集合中的项目。例如。添加一个新元素可能需要在包含类等中添加一些额外的簿记。当你返回List<T>时,你会失去这种控制权,除非你在返回它时复制它(但是客户应该理解它们只会得到一份收集和修改的副本。)

总而言之,您可以通过避免公开类似List<T>的类并更明确地了解如何添加,修改和删除聚合元素来改进您的类设计。但是如果你赶时间并且想要编写一些代码,那么使用List<T>可能正是你完成工作所需要的。

答案 1 :(得分:4)

不要在公共属性中使用通用列表,只要您不编写其他人希望在不久的将来扩展的框架。 我建议压制警告。如果需求发生变化,您可以稍后重构您的课程。

答案 2 :(得分:1)

恕我直言,您对“不要公开通用列表”的解释建议使用集合代替列表“。是无效的。

集合和列表之间的关键区别在于列表中的元素是有序的。某些方法可能要求传递的元素具有顺序。然后我们必须在参数列表中使用。

理解传递警告的关键是您应该使用接口List<T>而不是具体的类IList<T>

由于该方法在列表上运行,因此它不是那么重要的列表。关键因素是它是一个列表。

结束方法参数应尽可能抽象。

答案 3 :(得分:0)

您应该使用最适合您的类型(并在适当时禁止警告)。如果您传递了大量项目,并且订单和唯一性无关紧要,请使用集合。如果您要传递有序的项目集合,请使用列表。如果您传递的数据使得每个项目都是唯一的,但顺序无关紧要,请使用一组。使用具有适合交换的语义含义的类型。在一些情况下,您需要的语义和方法不一定对齐(假设您需要AddRange),请设置异常或使用转换方法。