泛型将类型参数的概念引入 .NET,这样就可设计具有以下特征的类和方法:在客户端代码声明并初始化这些类或方法之前,这些类或方法会延迟指定一个或多个类型。 例如,通过使用泛型类型参数
T
,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险,如下所示:
// Declare the generic class.
public class GenericList<T>
public void Add(T input) { }
class TestGenericList
private class ExampleClass { }
static void Main()
// Declare a list of type int.
GenericList<int> list1 = new GenericList<int>();
list1.Add(1);
// Declare a list of type string.
GenericList<string> list2 = new GenericList<string>();
list2.Add("");
// Declare a list of type ExampleClass.
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
list3.Add(new ExampleClass());
泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。 泛型通常与集合以及作用于集合的方法一起使用。
System.Collections.Generic
命名空间包含几个基于泛型的集合类。 非泛型集合(如
ArrayList
)不建议使用,并且保留用于兼容性目的。 有关详细信息,请参阅
.NET 中的泛型
。
你也可创建自定义泛型类型和泛型方法,以提供自己的通用解决方案,设计类型安全的高效模式。 以下代码示例演示了出于演示目的的简单泛型链接列表类。 (大多数情况下,应使用 .NET 提供的
List<T>
类,而不是自行创建类。)在通常使用具体类型来指示列表中所存储项的类型的情况下,可使用类型参数
T
。 其使用方法如下:
在
AddHead
方法中作为方法参数的类型。
在
Node
嵌套类中作为
Data
属性的返回类型。
在嵌套类中作为私有成员
data
的类型。
T
可用于
Node
嵌套类。 如果使用具体类型实例化
GenericList<T>
(例如,作为
GenericList<int>
),则出现的所有
T
都将替换为
int
。
// type parameter T in angle brackets
public class GenericList<T>
// The nested class is also generic on T.
private class Node
// T used in non-generic constructor.
public Node(T t)
next = null;
data = t;
private Node? next;
public Node? Next
get { return next; }
set { next = value; }
// T as private member data type.
private T data;
// T as return type of property.
public T Data
get { return data; }
set { data = value; }
private Node? head;
// constructor
public GenericList()
head = null;
// T as method parameter type:
public void AddHead(T t)
Node n = new Node(t);
n.Next = head;
head = n;
public IEnumerator<T> GetEnumerator()
Node? current = head;
while (current != null)
yield return current.Data;
current = current.Next;
以下代码示例演示了客户端代码如何使用泛型
GenericList<T>
类来创建整数列表。 只需更改类型参数,即可轻松修改以下代码,创建字符串或任何其他自定义类型的列表:
class TestGenericList
static void Main()
// int is the type argument
GenericList<int> list = new GenericList<int>();
for (int x = 0; x < 10; x++)
list.AddHead(x);
foreach (int i in list)
System.Console.Write(i + " ");
System.Console.WriteLine("\nDone");
使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。
泛型最常见的用途是创建集合类。
.NET 类库在
System.Collections.Generic
命名空间中包含几个新的泛型集合类。 应尽可能使用泛型集合来代替某些类,如
System.Collections
命名空间中的
ArrayList
。
可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
可以对泛型类进行约束以访问特定数据类型的方法。
在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。
C# 语言规范
有关详细信息,请参阅
C# 语言规范
。
System.Collections.Generic
.NET 中的泛型