泛型和系统集合类

8

在迁移到.NET 2.0+之后,除了维护旧代码外,是否仍有使用systems.Collections命名空间的理由?是否应始终使用泛型命名空间?

4个回答

12
大多数情况下,泛型集合将比非泛型集合执行速度更快,并使您获得强类型的集合。比较 System.Collections 和 System.Collections.Generic 中提供的集合,您会得到以下“迁移”:

    非泛型                         泛型对应物
    ---------------------------------------------------------
    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(使用IEnumerable <T>或任何扩展它的内容) IComparer IComparer<T> IDictionary IDictionary<TKey,TValue> IEnumerable IEnumerable<T> IEnumerator IEnumerator<T> IEqualityComparer IEqualityComparer<T> IList IList<T>

ICollection是不可变的(没有成员来更改集合的内容),而ICollection<T>是可变的。这使得接口仅在名称上类似,而ICollection和IEnumerable<T>之间几乎没有区别。

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


KeyedCollection<TKey, TItem> 是 DictionaryBase 的一个合适替代品,具体取决于您要存储的数据。 - Anthony Mastrean

0
在某些情况下,通用容器的性能比旧容器更好。它们至少应该在所有情况下与旧容器一样表现良好,并且有助于捕获编程错误。这是更有帮助的抽象和更好的性能的罕见组合,因此没有太多理由避免使用它们。只有当你被迫使用一个在泛型出现之前编写的糟糕库时,才需要避免使用它们。

0

我看了一篇关于c#团队的Anders Hejlsberg的采访,他被问及是否对之前的.net版本有任何遗憾。没有在asp.net 1.0中使用泛型是他提到的第一件事。没有使用它意味着他们必须实现解决方法,这些解决方法将与.net库保持一致,并很快成为遗留代码。

我从未使用System.Collections命名空间,从他的陈述来看,这似乎是正确的路径。


0
关于泛型,我唯一能想到的坏处就是方差。例如,如果你有一个 List<Person> 并且你想将它传递给一个接受 List<object> 的方法,你不能这样做,因为 List<Person> 不能直接转换为 List<object>
这个问题在 .NET 4.0 中得到了解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接