我为什么要用Generics替换CollectionBase?

时间:2010-03-05 20:36:00

标签: c# .net generics collections

我不是在寻找,我在寻找原因?我找不到直截了当的答案。

6 个答案:

答案 0 :(得分:12)

是。 CollectionBase是以前的尝试,也是一种提供类型安全的方法。

泛型为您提供了这些优势,但又增加了两个巨大优势:

  1. 使用泛型,您在每次访问集合时都不再拥有装箱和拆箱功能。这提供了巨大的性能。优点
  2. 使用泛型,您可以对所有类型使用单个实现。使用CollectionBase,每种类型都需要一个自定义实现,这会导致大量重复的代码(即:可能存在错误)。
  3. 编辑:

    我想到了将代码转移到使用泛型集合的其他几个令人信服的理由:

    1. 使用泛型集合将允许您直接在集合上使用LINQ to Objects,而无需调用Cast<T>(CollectionBase不实现IEnumerable<T>,仅IEnumerable)。
    2. 提供与任何代码的一致性,这些代码应始终使用新的通用集合完成。

答案 1 :(得分:4)

以仅键入<type>为代价,对所有不同类型的收藏品进行强类型访问?

编辑: 如果要删除现有代码和工作代码,唯一的原因就是其他地方提到的性能。

答案 2 :(得分:2)

键入安全性,无需为每种类型编写大量代码。如果你看一下MSDN CollectionBase documentation中的例子,你必须编写很多样板代码来制作Int16的类型安全集合。随着泛型它有点短:

var myListofInt16 = new List<Int16>();

您不必编写的每一段代码都是您不会错的代码(我说因为它适用于我,我相信它也适用于其他人! ; - )

答案 3 :(得分:1)

使用CollectionBase,您需要扩展以提供泛型本机执行的功能。您必须在所有管道中写入,以便考虑您从中创建的子类的类型安全性。有了泛型,没有必要。你需要转换为泛型吗?这取决于你的情况,但我不会继续使用它。

另外,使用泛型而不是集合库为您提供了写入.net的所有扩展方法,以使常见任务更容易。 MS正在推动仿制药的使用,并积极开发其应用。他们很可能会继续发展他们的功能。

答案 4 :(得分:0)

你想使用泛型来避免拳击。

这是一个很好的article列出了泛型的好处。

答案 5 :(得分:0)

还有另一个原因。

LINQ。

您只能对实现IEnumerable<T>的集合使用LINQ方法 要在CollectionBase上使用LINQ,您必须先拨打Cast<T>,或在课程上手动实施IEnumerable<T>。 通过继承ObjectModel.Collection<T>,您可以免费获得IEnumerable<T>实施。