添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

泛型将类型参数的概念引入 .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 中的泛型
  •