在.NET 2.0+中使用List(Of T)的集合有什么优势

时间:2009-01-30 14:08:58

标签: .net generics collections

我让另一位开发人员问为什么我在整个地方都使用List ...我想了一会儿......并且无法得出明确的答案。

如果从集合基类继承而不是使用List(Of T) - 你会得到什么好处?或者 - 你不能用List获得什么?

5 个答案:

答案 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>。
  •   

Source