1、什么是泛型

延迟声明

泛型 参数:在声明的时候定义一个占位符(尖括号),指定类型参数,在调用的时候确定类型

泛型方法:一个方法满足了不同类型的需求

泛型类:一个类满足不同的需求,其子类在定义时要指定类型

泛型接口:一个接口满足不同接口的需求

泛型委托:一个委托满足不同委托的需求

 

泛型缓存:

1、泛型缓存的本质是泛型类

2、泛型类会根据调用不同的类型生成不同的副本

3、根据不同的类型会生成不同的副本

 

1. 什么是泛型
List<T>
泛型就是宽泛的,不确定的类型 带尖括号的;
泛型包括且只有:泛型方法、泛型类、泛型接口、泛型委托;

泛型是因.Net Framework2.0框架升级而出来的:
1.编译器要升级,编译器能够支持类型参数,就是用占位符来表达, 1、2来表示,数字表示泛型类型参数个数。
2.CLR(公共语言运行库),也需要升级,才能支持占位符,运行的时候,类型确定,会把占位符替换成具体的类型。

泛型不是语法糖:
语法糖是编译器提供的便捷功能
比如 var i = 1234; 编译器自动识别出来是int类型,这个var就是语法糖。

2. 泛型方法
泛型方法就是方法名后面加尖括号<>;

Show (T params)

T:类型参数 typeparam
T是什么,它是一个占位符,T想要是什么就是什么,其实在编译器编译的时候并不指定是什么,知道CLR/JIT即时编译的时候才确定是什么类型,那么是怎么确定的呢?

其实是因为在编译的时候,会针对于泛型给定一个占位符如:`1, `2, `3,数字表示参数个数,

然后在JIT即时编译的时候,会把泛型(占位符)替换掉,这时候就明确了具体是什么类型,

那么为什么是再JIT即时编译时确定呢?因为这之后就是机器码执行了,机器码执行时肯定要知道时什么类型,不然没法执行,

说白了 T只是一个占位符,类型在声明的时候其实不确定,在调用的时候确定类型,这叫做 “延迟声明”,推迟一切可以推迟的,能晚点就晚点。

泛型方法:
延迟申明,性能和普通方法差不多,可以用一个方法满足多种类型的需求。

3. 为什么要使用泛型?
当我们写的功能相同或相似,但是处理的数据的类型不同的时候,就需要写很多的方法或类,这时候使用泛型就只需要写一个方法或类就可以了;

比如 在做数据库查询的时候,每一个实体都对应一个不同的表,如果每个实体都要写一个方法的话,就会造成代码冗余;

另一个减少代码的选项是Object类,
为什么呢?
因为object作为参数类型,调用的时候,可以把任何类型都传进来,
1.C#任何父类出现的地方都可以用子类代替;
2.Object是一切类型的基类;
但是存在2个问题?
1.这里会出现装箱和拆箱,性能损耗比较大;
2.派生自Object类的类型进行传递是不安全的;

4. 泛型缓存
缓存
缓存:其实就是一个暂存区,从数据库把数据取出来,然后放到一个暂存区,之后再去查询这个数据的时候就可以直接从缓存里面取就好,不用再取访问数据库,这就叫做缓存。

通常都是用的字典缓存(Dictionary键值对的形式),
先定义一个字段,第一次进来去字典里判断,如果没有的话就保存到字典里,然后下次再访问的时候就从字典里面取,
定义为一个静态变量,保证在整个内存中是有且唯一的缓存。

泛型缓存
必须是一个泛型类
在第一次执行的时候会执行静态构造函数,之后就不会再执行到;
它会根据传入的不同类型,
为每一个类型生成一个副本;
在使用泛型缓存的时候,其实相当于是去调用一个普通的类;

跟普通缓存的区别:
泛型缓存效率远远高于普通缓存

5. 泛型接口

//泛型接口
public interface ShowInterface<T>
{
}


//泛型委托
public delegate void Do<T>;

 

7. 泛型约束
其实就是约束T的类型
在参数最后加上where关键字

//基类约束
public static void Show<T>(T tParam)
where T : People //基类约束,只能是People,所以这里的参数只能传入People或People的子类
{
Console.WriteLine(tParam.Id);
}
//接口约束
public static void Show<T>(T tParam)
where T : IPeople
{
Console.WriteLine(tParam.Id);
}
//引用类型参数
public static void Show<T>(T tParam)
where T : class //只能传入引用类型的参数
{
Console.WriteLine(tParam.Id);
}

//值类型参数
public static void Show<T>(T tParam)
where T : strict //只能传入值类型的参数
{
Console.WriteLine(tParam.Id);
}

//无参数构造函数参数
public static void Show<T>(T tParam)
where T : strict //只能传入无参数构造函数参数的参数
{
Console.WriteLine(tParam.Id);
}

可以多个约束一起用吗?
视情况而定
如值类型+引用类型约束就不可以
如果是引用类型+无参数构造函数约束就可以,用逗号分隔

泛型约束的好处:
1.加了约束以后可以获取更多的功能;
2.保证程序的准确性,稳定性
3.程序在调用的时候可以避免错误调用
————————————————
版权声明:本文为CSDN博主「sunny7878」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40508362/article/details/105881852