当前位置: 首页 > news >正文

C#泛型相关

什么是泛型?

泛型是C#2.0版本和公共语言运行库 (CLR) 中的一个非常重要的新功能。泛型就是类型参数化,用于处理的数据类型不固定的情况下,将类型作为参数传入。

使用泛型的好处?

  • 代码复用:我们一套代码可以支持不同的类型。
  • 降低了耦合性:代码逻辑和数据类型之间分离,实现了解耦。
  • 更好的可读性:我们在使用集合的时候,定义了一个list 如List<string>,一看便知道这个一个存放string类型的list。
  • 程序性能提高:在一定的程度上减少了类型转换装箱与拆箱操作带来的性能损耗。
  • 类型安全性增强:泛型可以在编译时捕获类型错误,使得代码更加安全。编译器会在编译时检查泛型类型的使用,避免了在运行时发生类型错误的可能性,从而减少了程序出错的风险。

泛型使用where约束的原因是什么?

约束指定类型参数的功能和预期。

C#泛型类型参数约束有哪些?

详情阅读:类型参数的约束 - C# | Microsoft Learn

约束

描述

where T : struct

类型参数必须是不可为 null 的值类型

。 有关可为 null 的值类型的信息,请参阅可为 null 的值类型

。 由于所有值类型都具有可访问的无参数构造函数,因此 struct 约束表示 new() 约束,并且不能与 new() 约束结合使用。 struct 约束也不能与 unmanaged 约束结合使用。

where T : class

类型参数必须是引用类型。 此约束还应用于任何类、接口、委托或数组类型。 在 C#8.0 或更高版本中的可为 null 上下文中,T 必须是不可为 null 的引用类型。

where T : class?

类型参数必须是可为 null 或不可为 null 的引用类型。 此约束还应用于任何类、接口、委托或数组类型。

where T : notnull

类型参数必须是不可为 null 的类型。 参数可以是 C# 8.0 或更高版本中的不可为 null 的引用类型,也可以是不可为 null 的值类型。

where T : default

重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。 default 约束表示基方法,但不包含 class 或 struct 约束。 有关详细信息,请参阅约束规范建议。

where T : unmanaged

类型参数必须是不可为 null 的非托管类型

。 unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。

where T : new()

类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 struct 和 unmanaged 约束结合使用。

where T :where T :

类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。

where T :where T :

类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 可以是从指定基类派生的可为 null 或不可为 null 的类型。

where T :where T :

类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是实现指定接口的不可为 null 的类型。

where T :where T :

类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 中的可为 null 上下文中,T 可以是可为 null 的引用类型、不可为 null 的引用类型或值类型。 T 不能是可为 null 的值类型。

where T : U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 在可为 null 的上下文中,如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。 如果 U 是可为 null 的引用类型,则 T 可以是可为 null 的引用类型,也可以是不可为 null 的引用类型。

参考文章

类型参数的约束 - C# | Microsoft Learn


http://www.mrgr.cn/news/16680.html

相关文章:

  • 通用后台管理系统实战演示(Vue3 + element-plus)汇总篇一
  • UML类图中的组合关系
  • Java设计模式【解释器模式】-行为型
  • Java设计模式【观察者模式】-行为型
  • 前端面试——八股文
  • 【C++ Primer Plus习题】7.8
  • USER_RAM_AVERAGE_ACTIVITY
  • 集成电路学习:什么是Bootloader启动加载程序
  • day-45 全排列
  • ffmpeg源码分析(六)内存管理
  • 类图的关联关系
  • (备份)常用ASCII 8*8 点阵 以及查询显示字符的点阵
  • AI模型:追求全能还是专精?
  • 写给LLM新手的建议,让你少走2年弯路!
  • Day53 | Bellman_ford 队列优化算法(又名SPFA)bellman_ford之判断负权回路 bellman_ford之单源有限最短路
  • Python---包和模块
  • MySQL锁机制的介绍
  • 推理引擎测试-算力共享:test_inference_engine
  • 消息中间件:深入理解 Kafka的消息顺序和一致性、可靠性和高可用性 第1版
  • X86架构(六)——硬盘访问与控制