首页 > 编程语言 >C#类后面的约束

C#类后面的约束

时间:2024-08-07 16:50:34浏览次数:9  
标签:C# 后面 约束 参数 类型 new where

在C#编程中,类型参数约束用于在声明泛型类、方法、委托或接口时,对类型参数做出限制,确保客户端代码传递给泛型类型的类型参数满足特定条件。类型参数约束让编译器知道类型参数必须具备什么样的功能,这样编译器就可以安全地在泛型代码内部调用那些依赖于特定条件的方法或属性。

 

以下是C#中支持的主要类型参数约束:

1.类约束(class)

where T : class

这表明类型参数 T 必须是一个引用类型(包括任何类或接口,但不包括值类型)。

2.值类型约束(struct)

where T : struct

这意味着类型参数 T 必须是一个不可为null的值类型。所有的值类型都有默认的无参构造函数,所以这也隐含了 new() 约束,因此不能同时显式指定 new() 和 struct 约束。

3.new()约束

where T : new()

表明类型参数 T 必须有一个无参的公共构造函数,这意味着任何传入的类型都可以通过 new T() 创建实例。

4.接口约束

where T : IComparable

或者同时指定多个接口:

where T : ISerializable, IComparable<T>

这要求类型参数 T 必须实现指定的接口。

5.基类约束

where T : MyBaseClass

要求类型参数 T 必须是从指定基类派生的类型。

6.可空约束(C# 8.0及以后版本)

where T : notnull

表示类型参数 T 不允许为null,适用于引用类型。

7.非托管约束(C# 7.3及以后版本)

where T : unmanaged

要求类型参数 T 是一个非托管类型,即值类型并且由编译器控制的内存管理,如整数、浮点数、指针类型等。

约束在泛型声明中使用 where 关键字来指定,例如:

public class MyClass<T> where T : IEquatable<T>, new(){    public T CreateInstance() => new T();    public bool IsEqualTo(T other) => other?.Equals(default(T)) ?? false;}

在这个例子中,类型参数 T 需要实现 IEquatable<T> 接口,并且必须有一个无参的公共构造函数。这样在类的内部就可以安全地创建 T 类型的新实例,并使用 Equals 方法进行比较。

标签:C#,后面,约束,参数,类型,new,where
From: https://www.cnblogs.com/apple-hu/p/18347383

相关文章

  • HarmonyOS DevEco Studio彻底修改工程名称
    关闭项目将项目文件夹替换为新的名称后重新打开项目将AppScope/app.json5中的bundleName改为新的包名{"app":{"bundleName":"com.example.newname",//改为新的包名"vendor":"example","versionCode":1000000,"......
  • C# 语法糖
    语法糖:是C#编程语言中为了简化代码和提高代码可读性而引入的一系列语言特性。这些特性在编译时会被转换成更基本的代码形式,但在编写代码时提供了更加简洁和直观的方式。1.表达式体属性:使用=>运算符定义属性的getter或setter。public string FullName => FirstName +......
  • 题解:Codeforces Round 964 (Div. 4) D
    D.Slavic'sExamtimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputSlavichasaverytoughexamandneedsyourhelpinordertopassit.Hereisthequestionheisstrugglingwith:Ther......
  • CentOS Stream 9 安装mysql 开启远程访问 忽略大小写
     更新sudodnfupdate安装MySQL服务器:这边安装的是默认8.0sudodnfinstallmysql-server启动MySQL服务:sudosystemctlstartmysqld确保MySQL服务设置为在启动时自动启动:sudosystemctlenablemysqld运行初始安全脚本来设置root用户密码和调整安全......
  • C#关键字汇总
    1.访问修饰符:public:访问不受限制。private:访问仅限于当前类。protected:访问限于当前类和派生类。internal:访问限于当前程序集。protectedinternal:访问限于当前程序集或派生类。2.类型声明:class:声明一个类。struct:声明一个值类型结构。interface:声明一个接口。enum:声明一个枚举。......
  • RockyLinux安装Docker
    更新系统sudodnfupdate安装 Docker 所需的软件包和依赖项sudodnfinstall-yyum-utilsdevice-mapper-persistent-datalvm2添加Docker官方的YUM仓库#官方sudoyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo#阿......
  • TapData 信创数据源 | 国产信创数据库 OceanBase 数据同步指南,加速国产化进程,推进自主
    随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的国产数据库正在成为主流。长期以来,作为拥有纯国产自研背景的TapData,自是非常重视对于更多国产信创数据库的数据连接器支持,旗下产品已陆续与阿里云、华为云、麒麟软件、优炫数据库、A......
  • C#读取BIFF4格式的Excel文件
    使用NPOI读取这种格式的Excel文件时会报错:ThesupplieddataappearstobeinBIFF4format.HSSFonlysupportstheBIFF8format,tryOldExcelExtractor如果使用OldExcelExtractor类的话,只能提取成文本,无法结构化读取。 使用ExcelDataRead库https://github.com/ExcelDat......
  • Docker部署.netCore6
    Docker部署.netCore6第一步:在项目添加Docker支持第二步:选择Windows(如果是linx系统就选择linx)和Dockerfile第三步:生成Docker默认文件 把默认代码修改第四步:修改Dockerfile文件属性(如果不修改则会导致发布的时候Docker文件没有一起发布)第五步:把项目发布到文件夹在发......
  • jeecg-vue3, BasicTable与抽屉useDrawer()的简单使用
    需求:分屏情况下,根据传入参数不同查看申请材料1.实现效果点击申请材料弹出,点击取消或点击空白处,抽屉消失2.代码实现2.1files.vue实现<template><divclass="container"><a-button@click="click('sqcl')"style="margin-left:5px;">申请材料</a-b......