1.Generic-泛型

发布时间 2023-09-04 10:21:05作者: Bug专员

一 Generic

如果使用Object会有哪些问题?
1.存在装箱、拆箱的性能问题
2.如果使用额外元素,会存在类型不安全的问题.

1 引入泛型:延迟声明
2 如何声明和使用泛型
3 泛型的好处和原理
4 泛型类、泛型方法、泛型接口、泛型委托
5 泛型约束
6 协变 逆变
7 泛型缓存

泛型 Generic 本质 ~占位符 (必须编译器支持)
1.泛型类、泛型方法、泛型接口、泛型委托

1.任何父类出现的地方都可以用子类替代;

2.泛型约束 :

1)基类约束 2)接口约束 3)引用类型约束 4)值类型约束 5)无参构造函数约束 关键字 where
值类型struct 、引用类型 Class 、父类、接口、new() 可实例化

3.协变&&逆变

协变 逆变 因为泛型存在的一个概念。只作用于 接口 委托之中

协变

协变原理
所谓的协变 就是 泛型可以用父类返回类型。关键词 out

关键词 out T只能做返回值
声明由子类参数,改为父类参数
例如:IEnumerable\Func<int>
List<string> listA = new List<string>();
IEnumerable<object> listB = new List<string>();
listB = listA;

Func<string> func1 = () => "";
Func<object> func = func1;

逆变

逆变原理
所谓逆变 就是 泛型中 可以用父类做参数类型。关键词 in

关键词 in T只能做参数
声明子类泛型  --实例化父类
例如:Action<object>

//声明父类 并实例化
Action<object> actionobj = t => { };

//声明子类 并实例化
Action<string> actionstring = actionobj;

//actionobj = actionstring;//这种编译器是报错的