泛型和System.Collections

时间:2008-11-30 11:41:29

标签: c# .net generics collections

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

4 个答案:

答案 0 :(得分:12)

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

    Non-Generic               Generic Equivalent
    ------------------------------------------------------------
    ArrayList                 List<T>
    BitArray                  N/A
    CaseInsensitiveComparer   N/A
    CollectionBase            Collection<T>
    Comparer                  Comparer<T>
    DictionaryBase            Dictionary<TKey,TValue>
    Hashtable                 Dictionary<TKey,TValue>
    Queue                     Queue<T>
    ReadOnlyCollectionBase    ReadOnlyCollection<T>
    SortedList                SortedList<TKey,TValue>
    Stack                     Stack<T>

    DictionaryEntry           KeyValuePair<TKey,TValue>

    ICollection               N/A (use IEnumerable<T> or anything that extends it)
    IComparer                 IComparer<T>
    IDictionary               IDictionary<TKey,TValue>
    IEnumerable               IEnumerable<T>
    IEnumerator               IEnumerator<T>
    IEqualityComparer         IEqualityComparer<T>
    IList                     IList<T>

ICollection是不可变的(没有成员来改变集合的内容)而ICollection&lt; T&gt;是可变的。这使得接口仅在名称上类似于ICollection和IEnumerable&lt; T&gt;。差别很小。

从这个列表中,唯一没有通用对应物的非泛型类是BitArray和CaseInsensitiveComparer。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我从不使用System.Collections命名空间,而且从他的陈述中,这似乎是正确的路径。

答案 3 :(得分:0)

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

在.NET 4.0中解决了这个问题。