【问题标题】:Why should I replace CollectionBase with Generics?为什么我应该用泛型替换 CollectionBase?
【发布时间】:2010-03-05 20:35:59
【问题描述】:

我不是在寻找如何,我在寻找为什么?我找不到一个直接的答案。

【问题讨论】:

    标签: c# .net generics collections


    【解决方案1】:

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

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

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

    编辑:

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

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

    【讨论】:

      【解决方案2】:

      只需键入 <type> 即可对所有不同类型的集合进行强类型访问?

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

      【讨论】:

      • 虽然我完全同意这是使用泛型的一个很好的理由,但它并没有说明为什么 OP 应该基于 CollectionBase 重写现有的功能代码。这里没有关于“为什么”代码应该替换的论据,只是实现了。切换到泛型将是更多的工作(预先),所以说它少打字并不一定是真的......
      • 是的,替换。我现在正在做这个项目......但真的不知道为什么。我看到很多“你应该这样做!”所以我正在这样做......
      • @dilbert789,对于“为什么”,我支持我的部分答案。你不必编写的每一行代码都是你不会出错的代码。 . :)
      • @Reed,确实如此。我没有从他将删除现有和工作代码的问题中“得到”。这似乎更像是一个理论问题。
      • @Rob,那么单独留下代码将更不容易出错。 :P
      【解决方案3】:

      类型安全,无需为每种类型编写大量代码。如果您查看MSDN CollectionBase documentation 中的示例,您必须编写大量样板代码来创建 Int16 的类型安全集合。使用泛型会更短一些:

      var myListofInt16 = new List<Int16>();
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 应该可能专门将 LINQ 称为您所指的扩展方法。人们对营销名称的反应比对技术描述的反应更多。 :)
        【解决方案5】:

        您想使用泛型来避免装箱。

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

        【讨论】:

          【解决方案6】:

          还有一个原因。

          LINQ。

          您只能对实现 IEnumerable&lt;T&gt; 的集合使用 LINQ 方法。
          要在 CollectionBase 上使用 LINQ,您必须先调用 Cast&lt;T&gt;,或者在类上手动实现 IEnumerable&lt;T&gt;
          通过从ObjectModel.Collection&lt;T&gt; 继承,您可以免费获得IEnumerable&lt;T&gt; 实现。

          【讨论】:

          • @SLaks:实际上,@Kevin 提到了它,只是没有说出它的名字。 "另外,使用泛型而不是集合库为您提供了写入 .net 的所有扩展方法"
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-26
          • 2015-05-19
          • 1970-01-01
          • 2011-01-25
          • 1970-01-01
          • 2019-09-09
          相关资源
          最近更新 更多