我打算编写一个库来遍历一个对象图(就像某种序列化一样)
您需要判断对象是否是遍历中的集合,因此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
这是一个错误吗?或者背后有一些原因?
答案 0 :(得分:0)
ICollection
现在没有.NET 1.1有用,因为没有ICollection<T>
可以提供更大的类型安全性。几乎没有人可以有效地使用ICollection
,而不能有效地使用ICollection<T>
,通常可以提高效率和/或类型安全性,尤其是当人们为可能想要对不同元素类型的集合进行处理。
这虽然引出了一个问题,为什么List<T>
之类的 会实施ICollection
。但是,在.NET 2.0中引入List<T>
时,所有旧代码都使用ICollection
和ArrayList
,而不是ICollection<T>
和List<T>
。升级代码以使用List<T>
而不是ArrayList
可能会很痛苦,特别是如果这意味着必须立即更改对ICollection
的所有使用,则可能会使用ICollection<T>
,或者,更糟糕的是,要加倍,因为某个方法正被List<T>
所命中,而其他非通用集合也所命中,因此每个方法都需要该方法的版本。通过ICollection
的实施,人们可以更加零碎地利用通用馆藏,从而简化了升级路径。
HashSet<T>
推出时,泛型已经使用了三年,并且该框架没有以前提供的非泛型哈希集类型,因此没有太多的升级麻烦,因此支持ICollection
的动机更少。