为什么HashSet <t>没有实现ICollection?

时间:2015-07-07 15:29:59

标签: .net collections interface hashset

我打算编写一个库来遍历一个对象图(就像某种序列化一样) 您需要判断对象是否是遍历中的集合,因此ICollection出现在我的脑海中。 (string也已实施IEnumerable

但是,除了ICollection只实现HashSet之外,集合中几乎所有容器都已实现ICollection<T>,这真的很奇怪......

我已经检查了System.Collections命名空间中的几乎所有常见容器:

ArrayList : IList, ICollection, IEnumerable, ICloneable  
BitArray : ICollection, IEnumerable, ICloneable  
Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable  
Queue : ICollection, IEnumerable, ICloneable  
SortedList : IDictionary, ICollection, IEnumerable, ICloneable  
Stack : ICollection, IEnumerable, ICloneable  
Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable, IDeserializationCallback
HashSet<T> : ISerializable, IDeserializationCallback, ISet<T>, ICollection<T>, IEnumerable<T>, IEnumerable  
LinkedList<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback  
List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable  
Queue<T> : IEnumerable<T>, ICollection, IEnumerable  
SortedDictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable  
SortedList<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable  
SortedSet<T> : ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback  
Stack<T> : IEnumerable<T>, ICollection, IEnumerable  

这是一个错误吗?或者背后有一些原因?

1 个答案:

答案 0 :(得分:0)

ICollection现在没有.NET 1.1有用,因为没有ICollection<T>可以提供更大的类型安全性。几乎没有人可以有效地使用ICollection,而不能有效地使用ICollection<T>,通常可以提高效率和/或类型安全性,尤其是当人们为可能想要对不同元素类型的集合进行处理。

这虽然引出了一个问题,为什么List<T>之类的 会实施ICollection。但是,在.NET 2.0中引入List<T>时,所有旧代码都使用ICollectionArrayList,而不是ICollection<T>List<T>。升级代码以使用List<T>而不是ArrayList可能会很痛苦,特别是如果这意味着必须立即更改对ICollection的所有使用,则可能会使用ICollection<T>,或者,更糟糕的是,要加倍,因为某个方法正被List<T>所命中,而其他非通用集合也所命中,因此每个方法都需要该方法的版本。通过ICollection的实施,人们可以更加零碎地利用通用馆藏,从而简化了升级路径。

HashSet<T>推出时,泛型已经使用了三年,并且该框架没有以前提供的非泛型哈希集类型,因此没有太多的升级麻烦,因此支持ICollection的动机更少。