.NET Framework 中的泛型概述

更新:2007 年 11 月

本主题概述 .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 Generic 
{
public:
    T Field;
};

在创建泛型类的实例时,会指定实际类型来替换类型参数。这会建立一个新的泛型类,称为构造泛型类,选定的类型将替换所有出现的类型参数。最后将得到按照您选择的类型定制的类型安全的类,如下面的代码所示。

Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";

泛型术语

下面的术语用于讨论 .NET Framework 中的泛型:

  • “泛型类型定义”是用作模板的类、结构或接口声明,其中具有该类、结构或接口声明可以包含或使用的类型的占位符。例如,Dictionary<TKey, TValue> 类可以包含两种类型:键和值。因为它只是一个模板,您不能创建作为泛型类型定义的类、结构或接口的实例。

  • “泛型类型参数”或称“类型参数”是泛型类型或方法定义中的占位符。Dictionary<TKey, TValue> 泛型类型具有两个类型参数:TKey 和 TValue,分别表示其键和值的类型。

  • “构造泛型类型”或称“构造类型”是为泛型类型定义的泛型类型参数指定类型得到的结果。

  • “泛型类型参数”是替换泛型类型参数的任何类型。

  • 术语“泛型类型”一般包括构造类型和泛型类型定义。

  • “约束”是加在泛型类型参数上的限制。例如,可以将类型参数限制为实现 IComparer<T> 泛型接口的类型以确保可以对该类型的实例进行排序。还可以将类型参数限制为具有特定基类的类型、具有默认构造函数的类型或是引用类型或值类型。泛型类型的用户不能替换不满足这些约束的类型参数。

  • “泛型方法定义”是具有两个参数列表的方法:一个泛型类型参数列表和一个形参列表。类型参数可以作为返回类型或形参的类型出现,如下面的代码所示。

    Function Generic(Of T)(ByVal arg As T) As T
        Dim temp As T = arg
        ...
    End Function
    
    T Generic<T>(T arg) { T temp = arg; ...}
    
    generic<typename T> T Generic(T arg) { T temp = arg; ...};
    

    泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法 G 是泛型方法。

    Class A
        Function G(Of T)(ByVal arg As T) As T
            ...
        End Function
    End Class
    Class Generic(Of T)
        Function M(ByVal arg As T) As T
            ...
        End Function
    End Class
    
    class A 
    {
        T G<T>(T arg) {...}
    }
    class Generic<T> 
    {
        T M(T arg) {...}
    }
    
    ref class A 
    {
        generic<T> T G(T arg) {...};
    };
    generic<typename T> ref class Generic 
    {
        T M(T arg) {...};
    };
    

Visual C++、C# 和 Visual Basic 都提供了对定义和使用泛型的完全支持。有关更多信息,请参见 Visual Basic 中的泛型类型泛型介绍(C# 编程指南)Overview of Generics in C++

嵌套类型和泛型

嵌套在泛型类型中的类型可依赖封闭泛型类型的类型参数。即使嵌套类型不具有自己的泛型类型参数,公共语言运行库也会将它们视为泛型。在创建嵌套类型的实例时,必须为所有封闭泛型类型指定类型参数。

请参见

任务

如何:定义具有反射发出的泛型类型

概念

何时使用泛型集合

Visual Basic 中的泛型类型

Overview of Generics in C++

.NET Framework 中的泛型集合

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

泛型接口

泛型的优点和限制

参考

System.Collections.Generic

System.Collections.ObjectModel

泛型介绍(C# 编程指南)

其他资源

常用的集合类型

反射类型和泛型类型

.NET Framework 中的泛型