、泛型
在C#中可以用<>占位符,来进行类型占位。由于泛型占位在编译之后就会被替换成对应的类型,所有可以重用,比object性能要好很多。但有一个不算太大的缺点:泛型占位在编译时必须确定类型(传入或编译器推断)。
泛型类 1.1 泛型类中占位符的几种约束
a.基类约束 pulic class Hourse<T> where T:Pig 只能传入Pig类型 b.接口约束 pulic class Hourse1<T> where T:IPig 只能传入实现了IPig接口的类型 c.引用类型约束 pulic class Hourse2<T> where T:class 只能传入引用类 型 d.值类型约束 pulic class Hourse3<T> where T:struct 只能传入值类型 f.构造器约束 pulic class Hourse4<T> where T:new() 只能传入能被new ()的类型 pulic class Hourse5<T> where T:class,new() -class关键字必须在 前面 。这种方式只能传入能被new()的引用类型 多个占位符的约束写法: 每一个约束用一个where 开头。例: pulic class Hourse6<T,V> where V:struct where T:class 1.2 泛型类的继承 a.非泛型类继承泛型类: 必须指定具体的父类占位符类型 public class Son:Person<string,int> b.泛型类继承泛型类: 如果子类要将站位符传给父类,则必须与父类的约束保持一致 pulic class Son2<X,Y>:Person<X,Y>占位符类型,此时子类可以不加约束 如果子类不传递占位符,那么必须为父类指定具体的 pulic calss Son3<X,Y>:Person<string,int> 1.3 封闭类型和开放类型的概念 编码时mylist<T> 是开发类型,运行时产生的具体类是封闭类型 自己实现的泛型类 ---》开放类型 ,可以更改 程序运行时生成的泛型类--》封闭类型,不可改 泛型方法 位置:泛型方法的类型参数,可以在该方法的 形参,方法体,返回值 1、泛型方法的占位符的
2、泛型方法的重载条件 a.参数个数不一致 b.参数类型不一致(形参非泛型部分)c.方法类型占位符个数不一致 3、泛型方法的重写,注意不需要重写约束条件 ,默认会自己添加
协变和逆变 只能用于泛型接口和泛型委托
协变: out ->代表当前占位符只能当做返回类型,不能当做入参类型 逆变: in ->代表当前占位符只能当做入参类型,不能当做返回类型