C#:List <T>和Collection <T>之间的区别(CA1002,不公开通用列表)

Svi*_*ish 95 c# collections encapsulation

试图在这里运行一个项目的运行代码分析,并得到一些警告说,像这样:

CA1002:Microsoft.Design:在' SomeClass.SomeProtectedOrPublicProperty '中更改'List < SomeType > '以使用Collection,ReadOnlyCollection或KeyedCollection

我为什么要用Collection<T>而不是List<T>?当我查看msdn文档时,它们看起来几乎相同.在阅读了警告的错误帮助后,我发现了

System.Collections.Generic.List(T)_是一个通用集合,专为性能而非继承而设计,因此不包含任何虚拟成员.

但这究竟意味着什么呢?我应该做什么呢?

我应该继续在List<T>内部使用,然后在属性中返回一个new Collection<T>(someList)而不是?或者我应该开始使用Collection<T>而不是List<T>

Rob*_*ine 137

简而言之,通用列表没有用于添加,删除等的虚拟方法,因为它被设计为快速,不可扩展.这意味着您无法将此具体实现交换为有用的子类(即使您可以将其子类化,因为它未被密封).

因此,通过公开List本身,您永远不能扩展您的集合以跟踪添加或删除操作(例如)而不破坏类的公共合同.

通过将您的集合公开为IList或类似的集合,您仍然可以使用List作为实际的后备存储,但是您保留了将来的可扩展性,因为您可以在不更改类的公共合同的情况下更换concerete实现.

  • 只是FYI,`Collection <T>`在内部使用`List <T>`实例. (10认同)

Sim*_*ens 24

Collection 公开一些虚拟成员(插入,删除,设置,清除),您可以覆盖这些虚拟成员,并在更改集合时提供其他功能(例如通知事件).

您现在可能不需要这个,但它是包含集合的类的常见要求,因此最好事先计划它.因为Collection它具有可扩展性,所以它非常灵活.如果将来您决定在集合中需要一些额外的功能,您可以扩展它而无需更改类的公共接口.如果您使用过列表,则必须将其更改为集合,这意味着它会破坏您的类的所有调用者,因为它们必须更改为使用列表.

List另一方面,设计时考虑了性能,因此只应在性能非常重要的特定情况下使用.因为它不可扩展,所以使用列表对任何事物进行更改都会破坏依赖它的所有其他内容.通常List只应在非常低级别的类中内部使用,并且不会暴露于任何东西以减少将来破坏更改的可能性.