C#:之间的差异列表<T> 和收集<T> (CA1002,不要暴露的通用清单)[重复]
-
22-07-2019 - |
题
这个问题已经有一个答案在这里:
想跑跑码分析上的一个项目,在这里,有一些警告说这样的事情:
CA1002:Microsoft。设计:改变名单<SomeType>'在'SomeClass.SomeProtectedOrPublicProperty'使用的收集、ReadOnlyCollection或KeyedCollection
为什么我应该使用 Collection<T>
而不是的 List<T>
?当我看msdn文件,他们似乎几乎相等。在阅读了错误的帮助警告,我发现,
系统。集合。通用的。列表(T)_is泛收集而设计的性能不能继承,因此,不含有任何虚拟的成员。
但这是什么真正的意思吗?和我应该怎么做呢?
我应该继续使用 List<T>
在内部,然后在"属性"返回一个 new Collection<T>(someList)
而不是?或我应该开始使用 Collection<T>
而不是的 List<T>
?
解决方案
总之,通用的清单并不具有虚拟的方法,用于添加、删除等,因为它的目的是要快,不可扩展的。这意味着你不能掉这个混凝土执行了一个有用的类(即使可以的子类,因为它不是密封的).
因此,通过公开名单本身,你可以永远不会延长你的收集,以跟踪添加或删除的操作(例如)不破坏公共合同的类。
暴露你的收藏作为一个IList或一些这样的,你仍然可以使用名单作为实际的后备储存,但保留未来的扩展作为可以交换出concerete实施后无需改变公共合同的类。
其他提示
Collection
暴露了一些虚成员(插入、删除、集、清除),可以复盖和提供额外的功能(例如通知的事件)时集合的变化。
你可能不需要这个的现在,但它是一个共同需要的课程包含收藏,所以最好对它计划提前。因 Collection
设计具有可扩展性牢记这是非常灵活。如果在未来你决定你需要一些额外的功能,在该收集你可以延长它没有任何改变公众的接口。如果你使用了清单,您必须要改变到一个收集这意味着它会已经打破所有的呼叫者的类,因为他们必须改变使用名单。
List
另一方面是设计与业绩记在心,因此只应用于特定的情况下,性能非常重要的。因为它是不可扩展的未来改变任何东西使用清单将打破其他一切都取决于它。通常 List
应该只在内部使用,在非常低水平类别,而不暴露到任何减少今后的重大更改。