【问题标题】:Why do C# and VB have Generics? What benefit do they provide? Generics, FTW为什么 C# 和 VB 都有泛型?他们提供什么好处?泛型,FTW
【发布时间】:2008-09-19 04:43:43
【问题描述】:

来自Wikipedia

泛型编程是一种风格 计算机编程在其中 算法是按照以下方式编写的 待指定的类型是 然后在需要时实例化 作为参数提供的特定类型 由 Ada 开创 出现在 1983 年。这种方法 允许编写通用函数或 仅在集合中不同的类型 它们在使用时操作的类型, 从而减少重复。

泛型提供了定义稍后指定的类型的能力。您不必将项目转换为类型即可使用它们,因为它们已经被键入。

为什么 C# 和 VB 都有泛型?他们提供什么好处?您发现使用它们有什么好处?

还有哪些其他语言也有泛型?

【问题讨论】:

    标签: c# .net vb.net generics


    【解决方案1】:

    C# 和 VB 具有泛型以利用底层 CLR 中的泛型支持(或者相反?)。它们允许您以静态类型语言编写代码,该语言可以应用于多种类型,而无需为您使用它们的每种类型重写代码(运行时将为您完成)或以其他方式使用 System.Object 并在任何地方进行强制转换(就像我们对 ArrayList 所做的那样)。

    你读过article吗?

    这些语言也有泛型:

    • C++(通过模板
    • Ada(通过 模板
    • 埃菲尔
    • D(通过模板
    • 哈斯克尔
    • Java

    【讨论】:

    • 泛型和模板之间有一些区别。 C++,Ada 和 D 有后者,其他的就不清楚了。
    • 除了其他内容之外,模板仍然允许使用泛型进行编写。
    【解决方案2】:

    就个人而言,我认为它们可以节省大量时间。我仍在使用 .NET Framework 1.1,每次需要特定集合时,都需要通过实现 CollectionBase 创建强类型集合。使用泛型,您只需像 List<MyObject> 那样声明您的集合即可。

    【讨论】:

      【解决方案3】:

      考虑这些方法签名:

      //Old and busted
      public abstract class Enum
      {
        public static object Parse(Type enumType, string value);
      }
      //To call it:
      MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString);
      

      //New and groovy
      public abstract class Enum
      {
        public static T Parse<T>(string value);
      }
      
      //To call it:
      MyEnum x = Enum.Parse<MyEnum>(someString);
      

      看 ma:没有运行时类型操作。

      【讨论】:

      • 我喜欢你对 Look ma 的评论。 :D
      【解决方案4】:

      来自MSDN

      泛型提供解决方案 早期版本的限制 公共语言运行时和 C# 泛化的语言 通过将类型转换为和来完成 来自通用基础类型 Object。 通过创建一个泛型类,您可以 创建一个类型安全的集合 在编译时。

      阅读该文章的其余部分,了解泛型如何提高代码的可读性和性能的一些示例。

      【讨论】:

        【解决方案5】:

        它们最常见的用途可能是具有强类型的 ArrayList。在 .NET 1.1 中,您要么必须将所有对象从对象转换为所需的类型,要么使用 CodeSmith 之类的东西来生成强类型的 ArrayList。

        此外,它们还有助于减少 boxing。同样,在 .NET 1.x 中,如果您尝试使用具有值类型的 ArrayList,您最终会在各处装箱和拆箱对象。泛型通过让您定义类型(无论是引用还是值)来避免这种情况。

        它们还有其他方便的用途,事件处理程序、LINQ 查询等。

        【讨论】:

          【解决方案6】:

          .NET 中的泛型非常适合对象集合。您可以根据需要定义对象类型,并且能够拥有例如 List 而无需为此编写任何代码,并且可以访问 .NET List 泛型集合的所有有效功能,同时对 T 是类型安全的。好东西。

          【讨论】:

            【解决方案7】:

            如果您熟悉泛型,那么泛型是建立在 c++ 中的模板概念之上的。

            这是一种实现算法或数据结构的方法,但会延迟使用它的实际类型。

            然后可以为列表分配您选择的任何类型 int、string 甚至自定义类型,该类型在构建列表时分配。但是您将能够使用列表操作添加删除等。

            通过习惯泛型,您确实可以节省大量编码工作。而且您不必在类型之间进行装箱和拆箱。

            Java 也有泛型。它们被称为通配符。

            【讨论】:

              【解决方案8】:

              .net 中的泛型,如继承和扩展方法,可以减少代码重复。让我通过重构来解释。

              如果所有具有共同祖先的类都有一个共同方法,则将该共同方法放在类的共同祖先(继承)中。

              如果某些类有一个使用公共契约来实现某些结果的公共方法,请将公共方法变成该公共契约的扩展方法。

              如果一些方法或类具有相同的代码,只是所作用的类型不同(尤其是在类型的细节与方法的操作无关的情况下),请将这些方法或类收集到泛型中。

              【讨论】:

                【解决方案9】:

                它们提高了使用值类型的集合的性能,因为不需要装箱/拆箱。它们使用起来更简洁,因为您不必将对象(例如使用 ArrayList)强制转换为所需的类型 - 同样它们有助于加强类型安全。

                【讨论】:

                  【解决方案10】:

                  在 C#(不是 Java,Java 是另一回事)中,泛型相对于非泛型类型的最大优势在于它们的速度要快得多。 JIT 生成它可以为给定类型提供的最佳机器代码。 List&lt;int&gt; 实际上是一个整数列表,而不是包装一个整数的整数对象。这使得泛型类型非常快并且类型安全,可以帮助您在编译时检测到大量错误:)

                  【讨论】:

                    【解决方案11】:

                    常见的例子是集合。例如一组类型 T,作为 Add(T) 方法和 T get() 方法。相同的代码,不同类型的安全集合。

                    C++、D、Ada 和其他有模板、泛型的超集,它们做的有点不同的错误得到相同的最终结果(然后是一些)。

                    IIRC Java 有泛型,但我不使用 Java。

                    【讨论】:

                      【解决方案12】:

                      解释它的最简单方法是举一个例子。假设您需要两个哈希表,一个将字符串类型的对象映射到 int 类型,另一个将字符串类型的对象映射到 double 类型。您可以定义 Hashtable,然后使用 K 和 V 类型。如果没有泛型,您将不得不使用“对象”类型,除了必须强制转换为有意义之外,它还放弃了类型安全。只需实例化 Hashtable 和 Hashtable,您的哈希表就会经过适当的类型检查等等。

                      【讨论】:

                        【解决方案13】:

                        Java 也有泛型。 C++ 有模板。

                        像 Perl 和 Javascript 这样的动态语言没有相同的类型限制,因此它们可以通过更少的工作获得几乎相同的好处。

                        【讨论】:

                        • 没有好处,因为它们根本不提供任何类型安全性。
                        • 泛型集合比类型安全有更多好处。
                        【解决方案14】:

                        在 Objective-C 中,您可以使用协议来实现泛型的目标。但是,由于该语言是弱类型的,因此通常不像您在与类型系统作斗争以对多种类型使用一个代码路径时那样担心。

                        【讨论】:

                          【解决方案15】:

                          就我个人而言,我是泛型的忠实粉丝,因为我不必编写所有代码。

                          What is Inversion of Control?

                          【讨论】:

                            猜你喜欢
                            • 2010-09-09
                            • 2010-09-23
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多