C# ';Don';t公开泛型列表';,为什么要使用集合<;T>;而不是列表<;T>;in方法参数

C# ';Don';t公开泛型列表';,为什么要使用集合<;T>;而不是列表<;T>;in方法参数,c#,generics,collections,C#,Generics,Collections,我使用的是FxCop,它显示了“不要公开通用列表”的警告,建议使用Collection而不是list。我之所以喜欢它,是因为我知道所有这些东西,正如和和我读过的更多文章中提到的 但我的问题是,我没有几个方法可以进行如此繁重的计算,而且这些方法可以接受List的参数,这在性能方面应该更快、更好。但FxCop对此也发出了警告。因此,一个选项是,我应该将参数声明为Collection,然后在方法内部使用ToList(),然后使用它 那么哪一个是优化的呢? “抑制这种情况下的警告”或“在参数中使用集合,

我使用的是FxCop,它显示了“不要公开通用列表”的警告,建议使用
Collection
而不是
list
。我之所以喜欢它,是因为我知道所有这些东西,正如和和我读过的更多文章中提到的

但我的问题是,我没有几个方法可以进行如此繁重的计算,而且这些方法可以接受
List
的参数,这在性能方面应该更快、更好。但FxCop对此也发出了警告。因此,一个选项是,我应该将参数声明为
Collection
,然后在方法内部使用
ToList()
,然后使用它

那么哪一个是优化的呢?
“抑制这种情况下的警告”“在参数中使用
集合
,然后在方法本身内部使用
ToList()

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

您应该使用最适合您的类型(如果合适,请抑制警告)。如果您要传递一组项目,并且顺序和唯一性无关紧要,请使用集合。如果要传递有序的项集合,请使用列表。如果要传递数据,使每个项目都是唯一的,但顺序无关紧要,请使用集合。使用具有适用于交换的语义含义的类型。在一些情况下,您需要的语义和方法不一定一致(假设您需要AddRange),请做出例外,或使用转换方法。

IMHO您对“不公开泛型列表”的解释,该解释建议使用集合而不是列表”。这是无效的

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

理解发出的警告的关键是,您应该使用接口而不是具体的类
List
IList

由于该方法是在列表上操作的,所以它是什么类型的列表并不重要。关键因素是它是一个列表


结论:方法参数应尽可能抽象

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

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


总而言之,您可以通过避免公开类(如
List
)以及更明确地说明如何添加、修改和删除聚合元素来改进类设计。但是,如果您很匆忙,只想编写一些代码,那么使用
List
可能正是完成工作所需的。

IList有什么问题吗?IList没有提供像AddRange()这样的方法&sort如果您需要可以使用的速度
List
,只要您不想让调用者知道集合的元素何时发生了更改。我们有很多对速度要求很高的计算(对大量的ECG数据进行分析),但采集速度太慢,因此我们在某些情况下使用
List
甚至普通数组。我想我是说,我认为
List
适合于数字运算。我说的是
列表
列表
,即原语列表。您确定在使用
集合
而不是
列表
时,确实会出现性能滞后吗?我是说,在你的特殊情况下?另外,如果你真的知道自己在做什么,为什么不使用
SuppressMessageAttribute
?询问“更好”选项会导致主观答案。您能否重新解释或澄清,以便我们提供客观的答案?