当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【最新华为OD机试E卷】boos的收入(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 网易校招面试题 - 如何给 10 台机器安装 Nginx
  • 视频中间件:与海康ISC平台级联
  • RK3588 系列之1—串口连接
  • Leetcode Hot 100刷题记录 -Day6(滑动窗口)
  • Java:路径计算与障碍物处理
  • Web自动化测试实战--博客系统
  • golang本地缓存fastcache高性能实现原理
  • 使用Python查找并移动两个文件夹中不重名的文件
  • ​字​节​一​面​
  • 深度学习基础(Datawhale X 李宏毅苹果书AI夏令营)
  • 排序算法之桶排序详细解读(附带Java代码解读)
  • 深度学习-HW3(CNN)卷积神经网络-图像分类-【Datawhale X 李宏毅苹果书 AI夏令营】
  • OpenCV绘图函数(13)绘制多边形函数函数polylines()的使用
  • Type-C接口诱骗取电快充方案
  • Google 是如何开发 Web 框架的
  • centos安装java运行环境jdk+tomcat
  • github指令
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JDK 6和JDK 7中的substring()方法
  • jquery cookie
  • mysql innodb 索引使用指南
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 开源地图数据可视化库——mapnik
  • 聊聊sentinel的DegradeSlot
  • 树莓派 - 使用须知
  • 数组大概知多少
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一天一个设计模式之JS实现——适配器模式
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Java总结 - String - 这篇请使劲喷我
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (1)虚拟机的安装与使用,linux系统安装
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)鸿鹄云架构一服务注册中心
  • (转)平衡树
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net framework4与其client profile版本的区别
  • .Net 知识杂记
  • .NET成年了,然后呢?
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET下的多线程编程—1-线程机制概述
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • /var/log/cvslog 太大
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • @RequestBody与@RequestParam
  • @拔赤:Web前端开发十日谈
  • [2019红帽杯]Snake
  • [Android] Implementation vs API dependency