[C# Essentials] Generic

Tags

Covariant & Contravariant

指的是泛型委托 / 接口在进行类型转换时,类型参数的cast方向
协变:允许类型参数由派生类 → 基类,一般用于泛型参数在类方法的返回值中的情况
逆变反之,用于在类方法接受一个泛型参数的情况
public interface ICovariant<out T> { T GetItem(); } public class CovariantExample<T> : ICovariant<T> { public T GetItem() { return default(T); } } ICovariant<object> obj = new CovariantExample<string>(); public interface IContravariant<in T> { void SetItem(T item); } public class ContravariantExample<T> : IContravariant<T> { public void SetItem(T item) { } } IContravariant<string> str = new ContravariantExample<object>();
 
 

泛型的内部机制

泛型类的类型参数成了元数据,运行时会在需要时利用它们构造恰当的类
notion image
notion image
比普通类多一个元数(泛型参数个数)和类型参数
 
基于值类型的泛型:
运行时会针对每个不同参数值类型创建一个具体化类型
比如声明两个Stack<int> ,则第二个运行时会重用已生成的具体化Stack<int> 的代码
性能较好,避免了装箱
 
基于引用类型的泛型:
不同于值类型,运行时用object替换类型参数来创建唯一的具体化的类型,实例化的时候返回对这个类型实例的引用,同时会分配具体类型的一个内存区域
(不是很懂)