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实现.
Sim*_*ens 24
Collection 公开一些虚拟成员(插入,删除,设置,清除),您可以覆盖这些虚拟成员,并在更改集合时提供其他功能(例如通知事件).
您现在可能不需要这个,但它是包含集合的类的常见要求,因此最好事先计划它.因为Collection它具有可扩展性,所以它非常灵活.如果将来您决定在集合中需要一些额外的功能,您可以扩展它而无需更改类的公共接口.如果您使用过列表,则必须将其更改为集合,这意味着它会破坏您的类的所有调用者,因为它们必须更改为使用列表.
List另一方面,设计时考虑了性能,因此只应在性能非常重要的特定情况下使用.因为它不可扩展,所以使用列表对任何事物进行更改都会破坏依赖它的所有其他内容.通常List只应在非常低级别的类中内部使用,并且不会暴露于任何东西以减少将来破坏更改的可能性.
| 归档时间: |
|
| 查看次数: |
68286 次 |
| 最近记录: |