16

我正在使用 FxCop,它显示“不要公开通用列表”的警告,建议使用Collection<T>而不是List<T>. 首选它的原因是,我知道所有这些东西,如这篇 SO 帖子MSDN以及我读过的更多文章中所述。

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

那么优化的是哪一个呢?

“抑制这种情况的警告”Collection<T>在参数中使用,然后ToList()在方法本身内部使用”。

4

4 回答 4

15

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

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

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

于 2013-05-29T11:14:45.700 回答
4

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

于 2013-05-29T10:52:00.177 回答
1

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

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

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

由于该方法对列表进行操作,因此它是哪种列表并不重要。关键因素是它是一个列表。

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

于 2013-05-29T11:12:30.503 回答
0

您应该使用最适合您的目的的类型(并在适当的情况下禁止显示警告)。如果您要传递一堆项目,并且顺序和唯一性无关紧要,请使用集合。如果您要传递有序的项目集合,请使用列表。如果您要传递的数据使得每个项目都是唯一的,但顺序无关紧要,请使用集合。使用具有适合交换的语义的类型。在少数情况下,您需要的语义和方法不一定对齐(假设您需要 AddRange),请例外处理,或使用转换方法。

于 2013-05-29T11:00:25.583 回答