目录
Generic ==> 泛型 ==> 泛型类,泛型方法
示例:泛型类
public class GenericHelper<T> where T : IComparable //类型参数的约束 让T一定有 CompareTo 方法 ==>也就是继承了IComparable接口的类
{
}
泛型方法 :
public T CompareTo<T>(T target1, T target2) where T : IComparable //类型参数的约束 让T一定有 CompareTo 方法 使得函数不报错
{
if (target1.CompareTo(target2) > 0)
{
return target1;
}
return target2;
}
重点 : T 就是 类型参数
泛型种类
根据类型参数是否提供实参,将泛型分为 未绑定泛型 和 已构造泛型;
未绑定泛型:没有为 类型参数 T 提供实际类型;
已构造泛型: 已经指定了 参数类型 T 的实际类型;
已构造泛型 又可以细分为 开放类型 和 密封类型
开放类型 : 包含类型参数的泛型
密封类型 : 已经为每一个类型参数都传递了实际数据类型的泛型
示例:判断是密封类型还是开放类型
值得注意的是 ContainsGenericParameters 直白翻译就是 存在泛型参数
泛型中的静态字段和静态方法
在普通类中如MyClass 类中定义了 一个静态字段x,则不管之后创建了多少个该类的实例,也不管从该类派生出多少实例,都只存在一个MyClass.x
但是泛型却稍微有所不同:
结果:
可以看出每个密封的泛型类型都有属于自己的静态变量
这是因为在实际参数替换泛型的类型参数 T 时,编译器会根据不同的类型实参,重新生成类型:
DictionaryStringKey<int>
DictionaryStringKey<string>
DictionaryStringKey<DateTime>
,对于编译器来说,每个密封类型泛型都是不同的类型所以它们拥有自己的静态字段,对于静态构造函数也是如此
类型参数推断
在实例化泛型类时一定要显示的给定 T 即 类型参数 的 实参 ,但是泛型方法可以不指定 类型参数
如下 :
结果:
这被称之为 类型推断 ,和 C#在 局部定义变量 时使用 var 很相似,切记 类型推断 只适用于 泛型方法
泛型参数的约束
在文章最前面展示的类和 方法 都有 where T :IComparable 其中 Where 语句用来使类型参数继承于 IComparable接口
从而使 参数一定继承于 IComparable ,从而对类型参数进行约束。
如下方法 :不加约束就会报错,因为不是所有的类型都有 CompareTo() 方法
C#中有4种 约束,它们语法类似 :泛型参数约束 要放在 泛型方法 或者 泛型类型 的末尾 并且使用 where 关键字
1、引用类型约束