C# 泛型

代码重用,是每个开发者都很熟悉的概念,它让我们提高了开发效率,泛型就是基于这种思想,给我们提供的算法重用的机制

一、基本概念

C# 泛型
像这样,就类似于在声明类型的时候,声明了一个未知类型T,这个T可以在Custom< T>中被当作正常的类型名使用
同样的,也可以声明一个泛型方法
C# 泛型

它的好处显而易见,就是能让不同类型的类型使用同样的方法,而且强类型避免的装箱拆箱,提升了性能

二、逆变和协变泛型类型参数

泛型使用in关键字来标记逆变形式的泛型类型参数
C# 泛型
这样,可以把类型实参为父类类型的委托,隐式赋值给子类类型为类型实参的委托

泛型使用out关键字来标记协变形式的泛型类型参数
C# 泛型
这个是,协变的例子

注意:

(1)这种写法,只能用于委托和接口类型
(2)标记了in的类型参数,只能作为方法的参数使用,而标记了out的类型参数,只能作为方法的返回值使用
(3)int及out无法和ref及out一起使用

三、约束

约束可以理解成给你定义的泛型方法的泛型实参提供筛选条件
C# 泛型
像这样,就限定了U必须是能转换成Parent的类型,使用时,传入Parent的对象或者它子类的对象都是可以的,但是其他的类型,例如int,string之类的对象,就会报错

1.主要约束

主要约束只能是代表非密封类的一个引用类型,最多只能指定一个主要约束,这就和类只能指定一个基类一样
C# 泛型

有两个特殊的class和struct

(1)class

C# 泛型
代表类型实参是引用类型的

(2)struct

C# 泛型
代表类型实参是值类型的

2.次要约束

次要约束就是代表接口类型的约束,和类继承接口的规则一样,接口类型的约束并不限制个数
C# 泛型
有一种特别的次要约束,叫做类型参数约束
C# 泛型

3.构造约束

C# 泛型
表示类型参数是实现了公共无参构造的非抽象类型,所以允许类型构造对象

注意

(1)子类重写的方法的约束是从父类的方法继承下来的,不能再给子类实现的方法提供约束
C# 泛型
就算是父类方法没有提供约束也不可以
C# 泛型
(2)类类型的约束必须在其他类型的约束之前
(3)所有值类型都是拥有无参构造器的,所以struct和构造约束一起使用会报错