找回密码
 立即注册
首页 业界区 业界 C#.Net筑基-泛型T & 协变逆变

C#.Net筑基-泛型T & 协变逆变

沃盼盼 2025-9-25 21:00:15
1.png

01、什么是泛型?

泛型(Generics)是C#中的一种强大的强类型扩展机制,在申明时用“占位符”类型参数“T”定义一个“模板类型”,比较类似于C++中的模板。泛型在使用时指定具体的T类型,从而方便的封装、复用代码,提高类型的安全性,减少类型转换和装箱。
2.png


  • 泛型就是为代码能 跨类型复用 而设计的,轻松复用代码逻辑,如List、Queue。
  • 用泛型参数来代替object,可以减少大量装箱、拆箱,显著提高代码性能,及代码安全性。比如C#中的List就是泛型版的ArrayList,Dictionary就是泛型版的Hashtable,非泛型版本就不建议使用了。
1.1、泛型知识点集合

知识点说明泛型类型类、结构体、接口、委托:申明时类型名后指定一个或多个泛型参数,class User{}。泛型方法在方法上指定泛型参数,public T Add(T x,T y){}。泛型参数“T”用尖括号的语法引入泛型参数“T",表示这是一个泛型类、或泛型方法,支持一个或多个泛型参数。泛型参数“T”命名一般用“T”或T开头来占位,表示一个模板类型,名称可自定义泛型约束where对泛型参数T的条件约束,限定T的类型、范围,更方便的封装代码 class User where T : struct开放类型 List未指定泛型参数的类型叫“开放类型”,不能直接使用。只有身体,没有灵魂,并不完整。封闭类型 List指定了泛型参数后的泛型为“封闭类型”,才是完整的类型,才可以实例化,这里的泛型参数为int。静态成员共享泛型类型中的静态成员,所有封闭类型是共享的。

  • 构造函数不可引入泛型参数。
  • 不同数量的泛型参数可以“重载”,interface IUser,interface IUser是不同的两个泛型类型。
3.jpeg

02、泛型约束where⭐

如果没有约束,泛型参数“T”可以用任何类型来替代。泛型约束可以约束泛型参数“T”的范围,然后可以利用约束类型的一些能力,这也是泛型比较强大的地方之一。

  • 约束条件用where:[约束1],[约束2]语法申明,跟在泛型申明后面,可以跟多个约束条件,逗号隔开。
  • 多个泛型参数,可用多个where分别约束。
泛型约束条件约束说明class必须为引用类型,可以是任何类、接口、委托、数组。struct必须为非null值类型。notnull不为 null 的类型。unmanaged“非托管类型”类型,内置的基础值类型如byte、int、char、float、double、bool、枚举、指针等。new()类型必须有无参构造函数,当与其他约束一起使用时,new() 约束必须在最后。Delegate类型必须为委托Enum枚举类型INumber类型为内置数值类型,如int、double,这个不错,非常便于封装数值相关的代码!如数学运算。具体接口、类型任意明确的类型、接口作为约束条件,不能是封闭类型(封闭类型用泛型就没有意义了)其他泛型类型约束类型可以继续用其他泛型类型,where T2 : IUser相互约束泛型参数之间相互约束,class MyClass where T : U 约束类型T 和U兼容自引用约束用自身类型作为约束,interface IUser where T : IUser<blockquote>

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册