C# 泛型 学习理解记录
参考学习抖音@新猿易码 视频
场景:
ArrayList arrayListInts = [1, 2, 3, 4];
arrayListInts. Add("5");
ArrayList arrayListStrings = ["a", "b", "c", "d"];
可以存不同类型,但存同一类型时,也是转Object类型,取出时转值类型,这个过程会慢,
在framework2.0后提出使用泛型解决这个问题,指定类型然后就不用转换类型来消耗资源;
泛型约束:
1.结构约束
public class StructList<T> where T :struct { }
约束为值类型(float int 等),泛型指定string就报错
2. 类约束
public class StructList<T> where T :class { }
约束为引用类型(string等,自定义类名),泛型指定int等值类型就报错
3.构造函数约束
public class xxxList<T> where T :new()
new() 即构造函数 不带参
4.基类名约束
public class xxxList<T> where T :基类名 { }
必须是这个基类或继承这个基类的派生类
5.接口约束
public class xxxList<T> where T :接口名 { }
实现对应接口
6.泛型方法还有个 泛型约束泛型
public class TestList<U>
{
//约束add增加的类型是U的类型或子类类型
public void Add<T>(T item) where T : U
{
// do something
}
}
协变和逆变
都是在接口中使用的,
协变 如上面截图,实现接口时 是返回类型,out T, 使用时父类在前,子类在后
逆变 如上面截图,实现接口时 是参数类型, in T, 使用时子类在前,父类在后
没遇到过具体使用场景,先记录,以后理解使用,反正是为了安全,使用协变 是,返回类型得到泛型限制,输入参数得不到,逆变 反之,
所以,在实例化之后,实现接口逆变的可以得到约束返回类型无传参的方法的使用,逆变得到 无返回类型而约束参数类型的方法 的使用
协变+逆变
想使用两种方法(函数)的引用,就一起实现,但两个泛型就不能完全一样了(可以一样或不一样?)
总结,泛型的使用可以 得到效果:
1. 代码可重用。如类型泛型就不用写多个类等
2. 性能好。不用想数组那样,一种类型还 拆箱装箱
3. 类型安全。约束类对应类型,在使用这些类的 函数或属性时一般都存在,可以正常调用