C#(六十二)之泛型的约束

类型约束

基类约束有两个重要的目的。

1:它允许在泛型类中使用有约束指定的基类成员。

2:确保只能使用支持指定基类或派生类的类型实例。

约束是使用 where 上下文关键字指定的。

下表列出了五种类型的约束:

约束

说明

T:struct

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。

T:class

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U   提供的参数或派生自为 U 提供的参数。这称为裸类型约束.

1:派生约束:

将约束定义在父类中,由其派生出的子类将受其约束。

(1):被约束类进行约束,列表list可以使用约束类中的成员。类型为 T 的所有项都保证是 基类对象或从 基类继承的对象

(2):实例化list的时候,尖括号<>中类型只能是基类或是其派生类的数据类型来实例化。

实例:

class Program{static void Main(string[] args){// 只能使用animal 或者dog (基类或者其派生类) 这就是约束animalFamily<dog> cate = new animalFamily<dog>();cate.Add(new dog("aaa"));cate.Add(new dog("bbb"));cate.Add(new dog("ccc"));cate.Display();Console.ReadLine();}}/// <summary>/// 动物基类/// </summary>class animal{public string name;public animal(string nameValue){name = nameValue;}}/// <summary>/// 狗类继承自动物类/// </summary>class dog : animal{public dog(string nameValue) :base(nameValue){}}/// <summary>/// 动物家庭类,继承自动物类/// </summary>/// <typeparam name="T"></typeparam>class animalFamily<T> where T : animal{public List<T> family = new List<T>();public void Add(T member){family.Add(member);}public void Display(){foreach (T item in family){Console.WriteLine(item.name);}}}

2:约束多个参数

可以对多个参数应用约束,并对一个参数应用多个约束,如下面的示例所示:

class Base { }
class Test<T, U>where U : structwhere T : Base, new() { }

关于约束,先简单看到这里,以后再补充。

有好的建议,请在下方输入你的评论。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud集成Sleuth+Zipkin进行链路追踪

关于微服务链路追踪的一些概念&#xff1a;【分布式链路追踪】 文章目录 1、整合Seluth2、日志信息分析3、Zipkin介绍4、Zipkin服务端安装5、搭配Sleuth整合客户端Zipkin6、收集数据7、存储trace数据 1、整合Seluth Spring Cloud Sleuth是一个用于追踪的工具&#xff0c;它可以…

智能化升级:科智立RFID AGV地标传感器助力AGV小车升级改造

引言 在这个日新月异的信息化时代&#xff0c;各行各业都在不断进行升级改造&#xff0c;以求在激烈的市场竞争中立于不败之地。其中&#xff0c;智能化升级是提升企业核心竞争力的重要手段。本篇文章将以AGV小车的智能化升级为话题&#xff0c;深入探讨科智立RFID AGV地标传感…

从0到1:跑团小程序开发心得笔记

背景介绍 随着健康意识的兴起&#xff0c;越来越多的人选择加入跑步俱乐部&#xff0c;不仅体验到了运动的乐趣&#xff0c;也感受到了人生的不同色&#xff0c;那么通过小程序&#xff0c;把俱乐部搬到手机上&#xff0c;通过小程序了解俱乐部动态和运动常识&#xff0c;可以…

网络安全问题严重?Web3和IP代理能否提供解决方案?

在数字世界中&#xff0c;网络安全问题越来越严重。黑客和网络犯罪分子利用各种手段来窃取个人信息、盗取数字资产或破坏网络服务。为了应对这些威胁&#xff0c;Web3和IP代理成为了有力的工具&#xff0c;可以帮助改善网络安全性&#xff0c;提高网络防御水平。 首先&#xff…

智能会议记录:利用剪映和Claude实现高效会议纪要制作

具体操作步骤可以是: 1、使用录音笔或手机录音将会议过程录制下来。 2、将录音文件上传到pc端&#xff0c;使用剪映程序,利用语音转文本和自然语言处理技术,分析音频&#xff0c;生成文字稿。 3、打开Claude网站。 4、粘贴会议文字。 5、输入提示词&#xff1a; 用中文总结该…

office CVE-2022-30190 RCE 复现

简介: 当用户点击word等应用程序时&#xff0c;会使用URL协议调用MSDT,随即启动msdt.exe程序造成远程代码执行漏洞。简单来说就是攻击者可以恶意构造一个word文档&#xff0c;诱骗受害者点击&#xff0c;从而导致系统被黑。 0x01 环境部署 1. 测试版本 Microsoft Office LTSC …

cjson坑系列二cJSON_AddStringToObject、cJSON_AddItemToObject申请内存失败

在使用cjson的时候遇见这样一个问题&#xff08;先看问题代码&#xff0c;如下&#xff09; void platform_set_matrix_by_udp(cJSON* para, const char* str) {char* chintstr NULL, * intstr NULL;cJSON* index, * val;int ch;char* matrix;int number 0;int rows[8] { …

arcgis建筑密度容积率覆盖率

大多数研究会把覆盖率当作建筑密度。 用覆盖率更恰当一些。 建筑覆盖率&#xff1a; 建筑物占据面积/街区面积 [Sum_area]/ ([area]*1000000) 排序检查数据&#xff0c;最大值0.75&#xff0c;最小值0. 建筑覆盖率&#xff0c;建筑密度的范围都应该在0-1之内&#xff0c;不是…

RabbitMQ死信交换机、TTL及延迟队列

一&#xff0c;死信交换机 1&#xff0c;什么是死信交换机 了解死信交换机之前我们先来了解一下什么是死信&#xff0c;当一个队列满足下面的三种情况的时候我们一般称为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用basic.reject或 basic.nack声明消费失…

消息队列——spring和springboot整合rabbitmq

目录 spring整合rabbitmq——生产者 rabbitmq配置文件信息 倒入生产者工程的相关代码 简单工作模式 spring整合rabbitmq——消费者 spring整合rabbitmq——配置详解 SpringBoot整合RabbitMQ——生产者 SpringBoot整合RabbitMQ——消费者 spring整合rabbitmq——生产者 使…

现代化 Android 开发:Jetpack Compose 最佳实践

作者&#xff1a;古哥E下 如果一直关注 Compose 的发展的话&#xff0c;可以明显感受到 2022 年和 2023 年的 Compose 使用讨论的声音已经完全不一样了, 2022 年还多是观望&#xff0c;2023 年就有很多团队开始采纳 Compose 来进行开发了。不过也有很多同学接触了下 Compose&am…

结合ChatGPT制作PPT

今天看到圈友的一个AI分享&#xff0c;然后自己本身需要做一个分享的PPT。刚好那着帖子实战一下。先说下整体感受。 优点&#xff1a;制作成本确实会比较低&#xff0c;很熟练的话大概就是1分钟一个都有可能。整体流程是先找个第三方PPT制作网站&#xff0c;看下支不支持文本转…