什么是泛型:泛型就是通过参数化类型来实现在同一份代码上操作多种数据类型,利用“参数化类型”将类型抽象化,从而实现灵活的复用。
使用泛型给代码带来的5点好处:1、可以最大限度的重用代码、保护类型的安全以及提高性能。
2、可以创建集合类。
3、可以创建自己的泛型接口、泛型方法、泛型类、泛型事件和泛型委托。
4、可以对泛型类进行约束,以访问特定数据类型的方法。
5、关于泛型数据类型中使用的类型的信息,可在运行时通过反射获取。
- 泛型的语法:泛型主要有泛型方法(例如:static void Swap<T>(ref T lhs, ref T rhs)),泛型接口( 例如: public interface IEnumerable<out T> : IEnumerable),泛型委托( 例如: public delegate void Action<in T>(T obj);)
-
常见的泛型类型
在泛型类型的定义中,出现的每个T(一个展位变量而已叫别的名字也行)在运行时都会被替换成实际的类型参数。下面是一些基础的泛型类型
1.泛型类class MyGenericClass<T>
{
//......
}
2.泛型接口interface GenericInterface<T>
{
void GenericMethod(T t);
}
3.泛型方法public void MyGenericMethod<T>()
{
//......
}
4.泛型数组
public T[] GenericArray;
5.泛型委托
public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input);
6.泛型结构struct MyGenericStruct<T>
{}
-
泛型类型参数约束
为什么要使用类型参数的约束呢,简单点说就是筛选类型参数,在使用泛型的代码中如果违反了某个约束不允许的类型来实例化则会产生编译错误,类型参数的约束是使用关键字where。
下面列出了6中类型的约束
1、where T: struct
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)。
2、where T : class
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
3、where T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
4、where T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
5、where T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
6、where T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。