C#:为什么Microsoft没有从ReadOnlyCollectionBase继承ReadOnlyCollection <t>?</t>

时间:2011-06-21 18:54:25

标签: c# generics collections

简单地说,微软定义了一个ReadOnlyCollectionBase,但是当ReadOnlyCollection<T>清楚地说这应该是这样的时候,它没有用它作为基类。

我在这里遗漏了什么吗?我的意思是,是否有充分的理由使这个类成为基类?

4 个答案:

答案 0 :(得分:21)

可能是因为它不是通用的并且实现了ICollectionReadOnlyCollection<T>是通用的并且实现了ICollection<T>。请注意,ICollection<T>未实现ICollection。在topic上:

  

ICollection<T>似乎是ICollection,但它实际上是一个非常不同的抽象。我们发现ICollection不是很有用。同时,我们没有表示读/写非索引集合的抽象。 ICollection<T>是这样的抽象,你可以说ICollection在通用世界中没有完全对应的对等体; IEnumerable<T>是最接近的。

从同一篇文章:

  

ReadOnlyCollection<T>要好得多ReadOnlyCollectionBase。它在System.Collections.ObjectModel命名空间中。

实际上,ReadOnlyCollection<T>在泛型领域是ReadOnlyCollectionBase

同样请注意,IList<T>未实现IList

通常,pre-generics类不能作为泛型类的有用抽象(IEnumerable除外)。

答案 1 :(得分:5)

如果你看一下.net框架的历史,你会发现自2.0以来的泛型,但是ReadOnlyCollectionBase已经在1.1中。不选择ReadOnlyCollectionBase的原因很简单 - 它不是通用的,而ReadOnlyCollection<T>的目标是通用的。因此它需要一个非常不同的继承树。

所有*CollectionBase类的目的是为在.net 1.1中实现强类型集合提供基础。随着2.0中泛型的引入,它们已经过时,但仍处于向后兼容的框架中。

答案 2 :(得分:1)

如果他们这样做,可能会违反Liskov's Substitution Principle

答案 3 :(得分:1)

从非泛型基类继承将是无效的。如果类型使用非泛型基础,那么它将是基础集合上方的一个薄层,其中通用特征将简单地从基础集合的基础object实例中转换而来。

这会导致不必要的装箱/取消装箱值类型。使用泛型的一个好处是避免这种装箱/拆箱,这可能会对集合的性能产生不利影响。