泛型的优点和限制

更新:2007 年 11 月

通过允许指定泛型类或方法操作的类型,泛型功能将类型安全的任务从您转移给了编译器。不需要编写代码来测试数据类型是否正确,因为在编译时会强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。

泛型提供了类型安全但没有增加多个实现的开销。例如,可以使用下面的变量声明创建字符串的链接列表:

Dim llist As New LinkedList(Of String)
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

不需要从基类型继承,也不需要重写成员。链接列表可以立即使用。有关 .NET Framework 提供的泛型集合类型,请参见 System.Collections.GenericSystem.Collections.ObjectModel

除类型安全外,由于不需要对值类型进行装箱,泛型集合类型对于存储和操作值类型执行的效果更好。

泛型委托启用类型安全回调而无需创建多个委托类。例如,Predicate<T> 泛型委托允许创建对特定类型实现您自己的搜索条件的方法,并允许将您的方法与 Array 类型的方法(如 Find<T>FindLast<T>FindAll<T>)一起使用。

泛型委托还可以用于动态生成的代码而不需要生成委托类型。这增加了可以使用轻量动态方法而不是生成整个程序集的方案的数量。有关更多信息,请参见如何:定义和执行动态方法DynamicMethod

在很多情况下,Visual Basic、Visual C++ 和 C# 编译器能够从上下文中确定泛型方法调用使用的类型,从而极大地简化了使用泛型方法的语法。例如,下面的代码演示调用 BinarySearch 泛型方法以搜索字符串数组的短格式和长格式。在短格式中,编译器从方法变量的类型中推导出正确的类型参数。

Dim index As Integer = Array.BinarySearch(myArray, "test string")
Dim index As Integer = _
    Array.BinarySearch(Of String)(myArray, "test string")
int index = Array.BinarySearch(myArray, "test string");
int index = Array.BinarySearch<string>(myArray, "test string");
int index = Array::BinarySearch(myArray, "test string");
int index = Array::BinarySearch<String^>(myArray, "test string");

泛型的限制

下面是 .NET Framework 2.0 版中对泛型的一些限制:

  • 泛型类型可以从大多数基类派生,例如 MarshalByRefObject(可以使用约束来要求泛型类型参数从诸如 MarshalByRefObject 这样的基类派生)。但是,此版本的 .NET Framework 不支持上下文绑定的泛型类型。泛型类型可以从 ContextBoundObject 派生,但是尝试创建该类型的实例将导致 TypeLoadException

  • 枚举不能有泛型类型参数。枚举只能以附带方式成为泛型(例如,由于它嵌套在用 Visual Basic、C# 或 C++ 定义的泛型类型中)。有关更多信息,请参见通用类型系统中的枚举

  • 轻量动态方法不能是泛型方法。有关动态方法的更多信息,请参见反射发出动态方法的情况

  • 在 Visual Basic、C# 和 C++ 中,包含在泛型类型中的嵌套类型不能被实例化,除非已将这些类型分配给所有封闭类型的类型参数。换句话说就是在反射中,使用这些语言定义的嵌套类型包括其所有封闭类型的类型参数。这样允许在嵌套类型的成员定义中使用封闭类型的类型参数。有关更多信息,请参见 MakeGenericType 中的“嵌套类型”。

    说明:

    通过在动态程序集中发出代码或通过使用 MSIL 汇编程序 (Ilasm.exe) 定义的嵌套类型不需要包括其封闭类型的类型参数;但是如果未包括,则这些类型参数也就不在嵌套类的范围中。

    有关更多信息,请参见 MakeGenericType 中的“嵌套类型”。

请参见

概念

.NET Framework 中的泛型概述

.NET Framework 中的泛型集合

用于操作数组和列表的泛型委托

泛型接口

参考

System.Collections.Generic

System.Collections.ObjectModel

其他资源

.NET Framework 中的泛型