泛型使您可以按照泛型操作的精确的数据类型定制方法、类、结构或接口。 例如,您可以使用 Dictionary<TKey, TValue> 泛型类并指定允许的键类型和允许的值类型,而不使用允许任何键类型和值类型的 Hashtable 类。 泛型的优点包括提高的代码可重用性和类型安全性。
本主题概述 .NET Framework 中的泛型并提供泛型类型或方法的摘要。 它包含下列部分:
定义和使用泛型
泛型术语
类库和语言支持
嵌套类型和泛型
相关主题
参考
定义和使用泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。 泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。 泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。 下面的代码阐释一个简单的泛型类定义。
Public Class Generic(Of T)
Public Field As T
End Class
public class Generic<T>
{
public T Field;
}
generic<typename T>
public ref class Generics
{
public:
T Field;
};
在创建泛型类的实例时,会指定实际类型来替换类型参数。 这会建立一个新的泛型类,称为构造泛型类,选定的类型将替换所有出现的类型参数。 最后将得到按照您选择的类型定制的类型安全的类,如下面的代码所示。
Public Shared Sub Main()
Dim g As New Generic(Of String)
g.Field = "A string"
'...
Console.WriteLine("Generic.Field = ""{0}""", g.Field)
Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
public static void Main()
{
Generic<string> g = new Generic<string>();
g.Field = "A string";
//...
Console.WriteLine("Generic.Field = \"{0}\"", g.Field);
Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
static void Main()
{
Generics<String^>^ g = gcnew Generics<String^>();
g->Field = "A string";
//...
Console::WriteLine("Generics.Field = \"{0}\"", g->Field);
Console::WriteLine("Generics.Field.GetType() = {0}", g->Field->GetType()->FullName);
}
返回页首
泛型术语
下面的术语用于讨论 .NET Framework 中的泛型:
“泛型类型定义”是用作模板的类、结构或接口声明,其中具有该类、结构或接口声明可以包含或使用的类型的占位符。 例如,System.Collections.Generic.Dictionary<TKey, TValue> 类可以包含两种类型:键和值。 因为泛型类型定义只是一个模板,您不能创建作为泛型类型定义的类、结构或接口的实例。
“泛型类型参数”或称“类型参数”是泛型类型或方法定义中的占位符。 System.Collections.Generic.Dictionary<TKey, TValue> 泛型类型具有两个类型参数:TKey 和 TValue,分别表示其键和值的类型。
“构造泛型类型”或称“构造类型”是为泛型类型定义的泛型类型参数指定类型得到的结果。
“泛型类型参数”是替换泛型类型参数的任何类型。
常见术语“泛型类型”包括构造类型和泛型类型定义。
通过泛型类型参数的协变和逆变,可以使用其类型参数的派生类型比目标构造类型的派生程度更大(协变)或更小(逆变)的构造泛型类型。 协变和逆变统称为变体。 有关更多信息,请参见泛型中的协变和逆变。
“约束”是加在泛型类型参数上的限制。 例如,可以将类型参数限制为实现 System.Collections.Generic.IComparer<T> 泛型接口的类型以确保可以对该类型的实例进行排序。 还可以将类型参数限制为具有特定基类的类型、具有默认构造函数的类型或是引用类型或值类型。 泛型类型的用户不能替换不满足这些约束的类型参数。
“泛型方法定义”是具有两个参数列表的方法:一个泛型类型参数列表和一个形参列表。 类型参数可以作为返回类型或形参的类型出现,如下面的代码所示。
Function Generic(Of T)(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
T Generic<T>(T arg)
{
T temp = arg;
//...
return temp;
}
generic<typename T>
T Generic(T arg)
{
T temp = arg;
//...
return temp;
}
泛型方法可以出现在泛型或非泛型类型上。 需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。 只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。 在下面的代码中,只有方法 G 是泛型方法。
Class A
Function G(Of T)(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
End Class
Class Generic(Of T)
Function M(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
End Class
class A
{
T G<T>(T arg)
{
T temp = arg;
//...
return temp;
}
}
class Generic<T>
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
}
ref class A
{
generic<typename T>
T G(T arg)
{
T temp = arg;
//...
return temp;
}
};
generic<typename T>
ref class Generic
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
};
返回页首
类库和语言支持
.NET Framework 在以下命名空间中提供了很多泛型集合类:
System.Collections.Generic 命名空间将 .NET Framework 提供的大部分泛型集合类型(如 List<T> 和 Dictionary<TKey, TValue> 泛型类)编入目录。
System.Collections.ObjectModel 命名空间将其他用于向类的用户公开对象模型的泛型集合类型(如 ReadOnlyCollection<T> 泛型类)编入目录。
System 命名空间中提供了实现排序和相等比较的泛型接口以及事件处理程序、转换和搜索谓词的泛型委托类型。
对泛型的支持已添加到 System.Reflection 命名空间中以检查泛型类型和泛型方法,添加到 System.Reflection.Emit 中以发出包含泛型类型和方法的动态程序集,添加到 System.CodeDom 中以生成包括泛型的源关系图。
公共语言运行时在 Microsoft 中间语言 (MSIL) 中提供了新的操作码和前缀来支持泛型类型,包括 Stelem、Ldelem、Unbox_Any、Constrained 和 Readonly。
Visual C++、C# 和 Visual Basic 都提供了对定义和使用泛型的完全支持。 有关语言支持的更多信息,请参见 Visual Basic 中的泛型类型 (Visual Basic)、泛型介绍(C# 编程指南)和 Overview of Generics in Visual C++。
返回页首
嵌套类型和泛型
嵌套在泛型类型中的类型可依赖封闭泛型类型的类型参数。 即使嵌套类型不具有自己的泛型类型参数,公共语言运行时也会将它们视为泛型。 在创建嵌套类型的实例时,必须为所有封闭泛型类型指定类型参数。
返回页首
相关主题
标题 |
说明 |
---|---|
描述 .NET Framework 中的泛型集合类和其他泛型类型。 |
|
描述用于转换、搜索谓词以及要对数组或集合的元素进行的操作的泛型委托。 |
|
描述在整个泛型类型系列中提供通用功能的泛型接口。 |
|
描述泛型类型参数中的协变和逆变。 |
|
总结使用泛型的优点和限制。 |
|
提供有关 .NET Framework 中的集合类型(包括泛型类型)的特征和使用方案的摘要信息。 |
|
描述确定何时使用泛型集合类型的一般规则。 |
|
解释如何生成包括泛型类型和方法的动态程序集。 |
|
向 Visual Basic 用户描述泛型功能,包括有关使用和定义泛型类型的帮助主题。 |
|
向 C# 用户提供定义和使用泛型类型的概述。 |
|
向 C++ 用户描述泛型功能,包括泛型和模板之间的差异。 |
返回页首
参考
System.Collections.ObjectModel
System.Reflection.Emit.OpCodes
返回页首