我让另一位开发人员问为什么我在整个地方都使用List ...我想了一会儿......并且无法得出明确的答案。
如果从集合基类继承而不是使用List(Of T) - 你会得到什么好处?或者 - 你不能用List获得什么?
答案 0 :(得分:4)
通用列表可以提升性能。
看到这个问题:
Do C# Generics Have a Perfomance Benefit?
引自MSDN:
使用它对您有利 特定于类型的实现 列出<(Of<(T>)>)类而不是 使用ArrayList类或编写 一个强类型的包装器集合 自己即可。原因是你的 实现必须做什么的.NET 框架已经为您做了,并且 公共语言运行库可以共享 Microsoft中间语言代码 和元数据,你的 实施不了。
答案 1 :(得分:1)
列表不是线程安全的,并不打算暴露。你可以使用Collection(Of T)代替(注意这与CollectionBase不同),或者只是暴露IList(Of T)或IEnumerable(Of T)。
答案 2 :(得分:1)
通用列表<>专为速度和内部使用而设计。通用集合<>另一方面,它是为可扩展性而设计的。
Collection<>的优势之一class是你可以覆盖几个不同的方法(ClearItems(),InsertItem(),RemoveItem()和SetItem())。通用列表<>另一方面,类型不提供可以覆盖的方法。
为什么这很重要?例如,假设未来的要求要求在将项添加到集合时引发ItemAdded事件。你使用过List<>类型,你没有太多的选择。你使用过Collection<>但是,您可以使用class来公开新的ItemAdded事件并覆盖InsertItem()方法,以便在添加项目时引发ItemAdded事件。
答案 3 :(得分:1)
类型转换需要花费时间,并且在使用泛型时会被阻止。如果使用List(Of T),则不需要类型转换,因为它将是强类型集合。如果使用ArrayList,则从Object转换为您自己的类型,反之亦然,这会导致额外的开销。
除此之外,您还可以防止在编译时无法检测到的类型转换问题。 (例如,在使用数组列表时,在数组列表中添加一个int应该包含字符串不是问题,但是如果在运行时不期望int,则会导致invalidcastexception。使用泛型列表或集合可以防止这种情况,因为代码不会编译。)
希望这有帮助。
答案 4 :(得分:0)
Microsoft建议继承Collection(Of T)。 List(Of T)API不保证在版本之间保持不变。因此,如果在公共接口中使用List(Of T),则在新版本的CLR上运行时代码可能会中断。
BCL的设计师之一Krzysztof Cwalina对List< T>有这样的说法:
为什么我们不建议使用List< T>在公共API中
我们不建议使用List< T>在公共API中有两个原因。
- 列表与LT; T>不是为了扩展而设计的。即你不能覆盖任何成员。这例如意味着返回List< T>的对象。在修改集合时,将无法通知属性。收集和LT; T>允许您覆盖SetItem受保护的成员,以便在添加新项目或更改现有项目时获得“通知”。
- 列表与LT; T>有许多成员在许多情况下都不相关。我们说List< T>对于公共对象模型来说太“忙”了。想象一下ListView.Items属性返回List< T>尽显其丰富。现在,看看实际的ListView.Items返回类型;它更简单,类似于Collection< T>或ReadOnlyCollection< T>。