迁移到.NET 2.0+之后是否有理由继续使用systems.Collections命名空间(除了维护遗留代码)?是否应该始终使用泛型命名空间?
答案 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中解决了这个问题。