来自维基百科:
泛型编程是一种计算机编程风格,其中算法根据待指定的类型编写,然后在需要时为作为参数提供的特定类型实例化,由 1983 年出现的 Ada 首创。这种方法允许编写常见的函数或类型仅在使用时它们所操作的类型集不同,从而减少了重复。
泛型提供了定义稍后指定的类型的能力。您不必将项目转换为类型来使用它们,因为它们已经被键入。
为什么 C# 和 VB 都有泛型?他们提供什么好处?您发现使用它们有什么好处?
还有哪些其他语言也有泛型?
C# 和 VB 有泛型来利用底层 CLR 中的泛型支持(或者相反?)。它们允许您以静态类型语言编写代码,该语言可以应用于多种类型,而无需为您使用它们的每种类型重写代码(运行时将为您执行此操作)或以其他方式使用System.Object并在任何地方进行强制转换(就像我们必须使用 ArrayList 一样)。
你读过这篇文章吗?
这些语言也有泛型:
就个人而言,我认为他们可以节省很多时间。我仍在使用 .NET Framework 1.1,每次需要特定集合时,都需要通过实现 CollectionBase 创建强类型集合。使用泛型,您只需要像这样声明您的集合即可List<MyObject>
。
考虑这些方法签名:
//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:没有运行时类型操作。
来自MSDN:
泛型为早期版本的公共语言运行时和 C# 语言中的限制提供了解决方案,在这些语言中,泛化是通过将类型转换为通用基类型 Object 来完成的。通过创建泛型类,您可以创建在编译时类型安全的集合。
阅读该文章的其余部分,了解泛型如何提高代码的可读性和性能的一些示例。
它们最常见的用途可能是具有强类型的 ArrayList。在 .NET 1.1 中,您要么必须将所有对象从对象转换为所需的类型,要么使用 CodeSmith 之类的东西来生成强类型的 ArrayList。
此外,它们有助于减少拳击。同样,在 .NET 1.x 中,如果您尝试使用具有值类型的 ArrayList,您最终会在各处装箱和拆箱对象。泛型通过让您定义类型(无论是引用还是值)来避免这种情况。
它们还有其他方便的用途,事件处理程序、LINQ 查询等。
.NET 中的泛型非常适合对象集合。您可以根据需要定义对象类型,并且能够拥有例如 List 而无需为此编写任何代码,并且可以访问 .NET List 泛型集合的所有高效功能,同时对 T 是类型安全的。好东西。
如果您熟悉泛型,则它们是基于 C++ 中的模板概念构建的。
它是一种实现算法或数据结构的方法,但会延迟使用它的实际类型。
然后可以为列表分配您选择的任何类型 int、string 甚至自定义类型,该类型是在构建列表时分配的。但是您将能够使用列表操作添加删除等。
通过习惯泛型,您可以真正节省大量的编码工作。而且您不必在类型之间进行装箱和拆箱。
Java 也有泛型。它们被称为通配符。
.net 中的泛型,如继承和扩展方法,可以减少代码重复。让我通过重构来解释。
如果所有具有共同祖先的类都有共同的方法,则将共同方法放在类的共同祖先(继承)中。
如果某些类有一个使用公共契约来实现某些结果的公共方法,则将公共方法变成该公共契约的扩展方法。
如果一些方法或类具有相同的代码,只是所作用的类型不同(尤其是在类型的细节与方法的操作无关的情况下),请将这些方法或类收集到泛型中。
它们提高了使用值类型的集合的性能,因为不需要装箱/拆箱。它们使用起来更简洁,因为您不必将对象(例如使用 ArrayList)强制转换为所需的类型 - 同样它们有助于强制执行类型安全。
在 C#(不是 Java,Java 是另一回事)中,泛型相对于非泛型类型的最大优势在于它们的速度要快得多。JIT 生成它可以为给定类型提供的最佳机器代码。 List<int>
实际上是一个整数列表,而不是包装一个整数的整数对象。这使得泛型类型非常快并且类型安全,可以帮助您在编译时检测到大量错误:)
常见的例子是集合。例如,一组类型 T,作为 Add(T) 方法和 T get() 方法。相同的代码,不同类型的安全集合。
C++、D、Ada 和其他人都有模板,这是泛型的超集,它们有一点不同的错误得到相同的最终结果(然后是一些)。
IIRC Java 有泛型,但我不做 Java。
解释它的最简单方法是举一个例子。假设您需要两个哈希表,一个将字符串类型的对象映射到 int 类型,另一个将字符串类型的对象映射到 double 类型。您可以定义 Hashtable,然后使用 K 和 V 类型。如果没有泛型,您将不得不使用“对象”类型,除了必须强制转换为有意义之外,它还放弃了类型安全。只需实例化 Hashtable 和 Hashtable,您就可以得到带有适当类型检查的哈希表等等。
Java 也有泛型。C++ 有模板。
Perl 和 Javascript 等动态语言没有相同的类型限制,因此它们可以通过更少的工作获得几乎相同的好处。
在 Objective-C 中,您可以使用协议来实现泛型的目标。然而,由于该语言是弱类型的,因此通常不像您在与类型系统作斗争以对多种类型使用一个代码路径时那样担心。
就我个人而言,我是泛型的忠实粉丝,因为我不必编写所有代码。