为什么C#和VB有generics? 他们提供了什么好处? generics,FTW

来自维基百科 :

通用编程是一种计算机编程风格,其中算法是根据待指定的后续类型编写的,然后在需要时作为参数提供的特定类型进行实例化,并由1983年出现的Ada开创。这种方法允许编写常用function或类型,仅在使用时操作的类型集不同,从而减少重复。

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

为什么C#和VB有generics? 他们提供了什么好处? 使用它们有什么好处?

还有哪些其他语言也有仿制药?

C#和VB有generics来利用底层CLR中的generics支持(或者反过来?)。 它们允许您使用静态类型语言编写代码,这些语言可以应用于多种类型,而无需为您使用它们的每种类型重写代码(运行时将为您执行此操作)或以其他方式使用System.Object并在任何地方进行转换(就像我们与ArrayList一样)。

你读过这篇文章吗?

这些语言也有generics:

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

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

考虑这些方法签名:

 //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(string value); } //To call it: MyEnum x = Enum.Parse(someString); 

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

来自MSDN :

generics为公共语言运行库的早期版本和C#语言提供了限制的解决方案,其中通过将类型转换为通用基类型对象来实现泛化。 通过创建generics类,您可以在编译时创建类型安全的集合。

阅读该文章的其余部分,以查看Generics如何提高代码的可读性和性能的一些示例。

可能最常见的用途是拥有强类型的ArrayLists。 在.NET 1.1中,您要么必须将所有内容从对象转换为所需的Type,要么使用类似CodeSmith的内容来生成强类型的ArrayList。

此外,他们有助于减少拳击 。 同样,在.NET 1.x中,如果您尝试使用具有值类型的ArrayList,则最终会在整个地方装箱和取消装箱对象。 generics通过让您定义Type,无论是Reference还是Value来避免这种情况。

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

.NET中的generics非常适合对象集合。 您可以根据需要定义您的对象类型,并且可以拥有List,而无需为其编写任何代码,并且可以访问.NET Listgenerics集合的所有高效function,同时对T类型安全。它是好东西。

如果您熟悉generics,那么generics就是基于c ++模板的概念。

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

然后可以为列表分配任何类型的int,string甚至自定义类型,在构造列表时分配类型。 但是你可以使用列表操作添加删除等。

通过习惯generics,你可以真正节省大量的编码工作。 而且您不必在类型之间进行包装和取消装箱。

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

.net中的generics,与inheritance和扩展方法一样,允许减少代码重复。 让我通过重构来解释。

如果具有共同祖先的所有类都具有公共方法,则将公共方法放在类的共同祖先(inheritence)中。

如果某些类具有使用公共合同来实现某些结果的通用方法,请将该公共方法作为该公共合同的扩展方法。

如果某些方法或类具有相同的代码,这些代码仅根据所采用的类型而不同(特别是在类型的详细信息与方法的操作无关的情况下),请将这些方法或类收集到generics中。

它们使用值类型提高集合的性能,因为不需要装箱/取消装箱。 它们使用起来要干净得多,因为您不必将对象(例如使用ArrayList)转换为所需类型 – 同样它们有助于强制实现类型安全。

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

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

C ++,D,Ada和其他人都有模板,generics的超集,它做了一点点不同的bug得到了相同的最终结果(然后是一些)。

IIRC Java有generics,但我不做Java。

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

Java也有generics。 C ++有模板。

像Perl和Javascript这样的动态语言不具有相同的类型限制,因此它们通过较少的工作获得大多数相同的好处。

在objective-C中,您可以使用协议来实现generics的目标。 但是,由于语言类型较弱,因此通常不会像对抗类型系统那样使用一种代码路径来处理多种类型时的问题。

我个人非常喜欢generics,因为我不需要编写所有代码。

什么是控制倒置?