C#: Difference between List<T> and Collection<T> (CA1002, Do not expose generic lists)
尝试在此处对一个项目运行运行代码分析,并收到了一些警告,这些警告如下所示:
CA1002 : Microsoft.Design : Change 'List
' in 'SomeClass.SomeProtectedOrPublicProperty' to use Collection, ReadOnlyCollection or KeyedCollection
为什么要用
System.Collections.Generic.List(T)_is a generic collection designed for performance not inheritance and, therefore, does not contain any virtual members.
但这到底意味着什么?我应该做什么呢?
我应该在内部继续使用
简而言之,通用列表没有用于添加、删除等的虚拟方法,因为它被设计为快速、不可扩展。这意味着您不能将这个具体的实现换成一个有用的子类(即使您可以将它子类化,因为它不是密封的)。
因此,通过公开列表本身,在不破坏类的公共约定的情况下,永远不能扩展集合来跟踪添加或删除操作(例如)。
通过将集合公开为IList或其他类似的类型,您仍然可以将该列表用作实际的后备存储,但是您可以保留将来的扩展性,因为您可以稍后交换concerte实现,而不必更改类的公共约定。
现在您可能不需要这样做,但对于包含集合的类来说,这是一个常见的需求,因此最好提前计划。因为
另一方面,