首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:List<T>和Collection<T>之间的区别(CA1002,不公开泛型列表)

问C#:List<T>和Collection<T>之间的区别(CA1002,不公开泛型列表)
EN

Stack Overflow用户
提问于 2009-08-05 09:24:15
回答 2查看 71.8K关注 0票数 101

我尝试在这里的一个项目上运行运行代码分析,并得到了一些类似如下的警告:

CA1002 : Microsoft.Design :将“”SomeClass.SomeProtectedOrPublicProperty“”中的“”List“”更改为使用集合、ReadOnlyCollection或KeyedCollection

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

System.Collections.Generic.List(T)_is是为执行而不是继承而设计的泛型集合,因此不包含任何虚拟成员。

但这到底是什么意思呢?那我该怎么做呢?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-05 09:30:20

简而言之,泛型列表没有用于添加、删除等的虚拟方法,因为它被设计为快速,而不是可扩展的。这意味着您不能用一个有用的子类替换这个具体的实现(即使您可以子类它,因为它不是密封的)。

因此,通过公开列表本身,您永远不能在不破坏类的公共约定的情况下扩展集合以跟踪添加或移除操作(例如)。

通过将集合公开为IList或诸如此类的形式,您仍然可以将列表用作实际的后备存储,但保留了将来的可扩展性,因为您可以在以后交换特定的实现,而无需更改类的公共契约。

票数 143
EN

Stack Overflow用户

发布于 2009-08-05 09:28:12

Collection公开了一些虚拟成员(insert、remove、set、clear),当集合发生更改时,您可以重写这些虚拟成员并提供其他功能(如通知事件)。

您现在可能不需要这样做,但对于包含集合的类来说,这是一个常见的需求,所以最好提前做好计划。因为Collection的设计考虑到了可扩展性,所以它非常灵活。如果将来你决定在集合中需要一些额外的特性,你可以简单地扩展它,而不需要对类的公共接口做任何更改。如果你使用了一个列表,你将不得不将它改为一个集合,这意味着它将破坏你的类的所有调用者,因为他们将不得不被更改为使用列表。

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

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1232108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档