C# - 泛型(Generic)
泛型简介
泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。
您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。
泛型特性
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
- 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
- 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
- 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 您可以对泛型类进行约束以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
泛型类
namespace GenericStudy { /// <summary> /// 泛型类 /// </summary> public class GenericClass<T> { public T[] Param { get; set; } public GenericClass(int size) { Param = new T[size]; } public T GetParam(int index) { return Param[index]; } public void SetParam(int index, T val) { Param[index] = val; } } }
泛型方法
using System; using System.Collections.Generic; using System.Text; namespace GenericStudy { /// <summary> /// 泛型方法 /// </summary> public class GenericMethod { public static void ConsoleType<T>() { Type t = typeof(T); Console.WriteLine(t.FullName); } } }
泛型类与泛型方法的调用
using System; namespace GenericStudy { /// <summary> /// 泛型学习 /// </summary> class Program { static void Main(string[] args) { //泛型类 GenericClass<int> genericClass = new GenericClass<int>(3); for (int i = 0; i < 3; i++) { genericClass.SetParam(i, i + 10); } for (int i = 0; i < 3; i++) { Console.WriteLine(genericClass.GetParam(i)); } GenericClass<string> genericClass1 = new GenericClass<string>(5); for (int i = 0; i < 5; i++) { genericClass1.SetParam(i, i.ToString()); } for (int i = 0; i < 5; i++) { Console.WriteLine(genericClass1.GetParam(i)); } //泛型方法 GenericMethod.ConsoleType<string>(); GenericMethod.ConsoleType<int>(); } } }
泛型的参数类型约束
where T : struct | T必须是一个结构类型
where T : class | T必须是一个Class类型
where T : new() | T必须要有一个无参构造函数
where T : NameOfBaseClass | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface | T必须实现名为NameOfInterface的接口
例如:指定T必须是Class类型
using System; using System.Collections.Generic; using System.Text; namespace GenericStudy { /// <summary> /// 泛型方法 /// </summary> public class GenericMethod { public static void ConsoleType<T>() where T : class { Type t = typeof(T); Console.WriteLine(t.FullName); } } }