generics和System.Collections

迁移到.NET 2.0+后,有没有理由继续使用systems.Collections命名空间(除了维护遗留代码)? 是否应该始终使用generics命名空间?

在大多数情况下,generics集合的执行速度将比非generics集合更快,并为您提供强类型集合的好处。 比较System.Collections和System.Collections.Generic中可用的集合,您将获得以下“迁移”:

    非generics通用等价物
     -------------------------------------------------- ----------
     ArrayList List 
     BitArray N / A.
     CaseInsensitiveComparer N / A.
     CollectionBase Collection 
     Comparer Comparer 
     DictionaryBase Dictionary 
     Hashtable Dictionary 
    队列队列
     ReadOnlyCollectionBase ReadOnlyCollection 
     SortedList SortedList 
    堆栈堆栈

     DictionaryEntry KeyValuePair 

     ICollection N / A(使用IEnumerable 或任何扩展它的东西)
     IComparer IComparer 
     IDictionary IDictionary 
     IEnumerable IEnumerable 
     IEnumerator IEnumerator 
     IEqualityComparer IEqualityComparer 
     IList IList 

ICollection是不可变的(没有成员可以更改集合的内容),而ICollection 是可变的。 这使得接口在名称上相似,而ICollection和IEnumerable 相差很小。

从该列表中,唯一没有通用对应的非generics类是BitArray和CaseInsensitiveComparer。

在某些情况下,通用容器的性能优于旧容器。 在任何情况下,它们至少应该与旧的一样好。 它们有助于捕捉编程错误。 这是一种更有用的抽象和更好的性能的罕见组合,因此没有太多理由可以避免它们。 只有当你被迫使用一个糟糕的图书馆时,你才能使用它,这是在仿制药之前编写的。

我看到了来自c#团队的Anders Hejlsberg的采访,他被问到是否有任何他对先前版本的.net感到遗憾。 在asp.net 1.0中没有generics是他提到的第一件事。 没有它意味着他们必须实现坚持.net库并很快成为遗留代码的变通方法。

我从不使用System.Collections命名空间,并且从他的语句中看起来这似乎是正确的路径。

关于使用Generics时我能想到的唯一不好的事情是方差,所以例如,如果你有一个List并且你想将它传递给一个接受List的方法,你就不能因为List无法直接转换为List

在.NET 4.0中解决了此问题。