C#泛型与泛型约束

【唐老狮】C#——泛型约束 上篇回顾 泛型语法 class类名<占位字母> 返回值类型函数名<占位字母>(参数类型参数...) 概念 泛型相当于类型占位符 占位字母可以有多个 占位字母一般为大写字母 定义类或方法时使用替代符代表变量类型 当真正使用类或者方法时再具体指定类型 种类 泛型类 泛型方法 上一篇文章,我们已经学习了泛型的基本知识点,泛型就是一个可以替代任何类型的一个占位符。那么如果我想约束使用者可以用的类型,应该如何处理呢?今天学习的知识... 阅读详情

为什么要使用泛型

考虑一种堆栈类

 class Stack
    {
        public string[] Elements { get; set; }
        public int Current { get; set; }
        public string Pop()
        {
            return Elements[Current];
        }
        public void Push(string element)
        {
        }
    }

上述堆栈类的元素是字符串类型,但实际开发中可能运用到很多不同的类型,甚至是自定义的类型。显然我们不可能为每一个类型新建一个“Stack”类。


简单的泛型应用

泛型类型参数

在C++模板中,使用“T”代表一个模板类型。这种用法同样延续到了C#中。
此外,还可以以T开头选择更加符合语境的词语,例如:
Dictionary<TKey,TValue>。
在泛型类型或泛型方法定义中,使用"T",以“T”为前缀的描述性词语,作为该泛型的类型参数更加符合规范。

泛型在类中

对于上述的Stack类,可以改写为如下形式

 class Stack<TElement>
    {
        public TElement[] Elements { get; set; }
        public int Current { get; set; }
        public TElement Pop()
        {
            return Elements[Current];
        }
        public void Push(string element)
        {
        }
    }
泛型在接口中

泛型在接口中广泛运用,特别是泛型集合类。
在System.Collections.Generic下存在大量泛型接口
在这里插入图片描述

泛型在接口中的简单使用如下:

interface IInterface<T>
    {
        void fun1(T t);
        T fun2();
    }

泛型在方法中

泛型也可以在方法中使用,代表一个使用类型参数声明的方法。
代码示例

public void Swap<T>(ref T lhs,ref T rhs)
        {
            
        }

泛型约束

定义泛型时,可以对泛型类或泛型接口,方法能够接收的类型参数的种类加以限制。在编译阶段,如果使用不符合要求的类作为类型参数,则会产生编译错误。

泛型约束的声明格式
使用where关键字指定泛型约束

泛型约束使用where关键字指定。例如,要限制一个泛型类必须具有无参数公共构造函数,代码如下:

class Stack<TElement> where TElement :new()
六种约束的格式说明

where T:struct

class Stack<TElement> where TElement :struct

限制类型参数必须是值类型,并且不可以是可空值类型(例如int?,char?,double?,bool?等)
where T: class

class Stack<TElement> where TElement :class

限制类型参数必须是引用类型
where T:基类名

class Stack<TElement> where TElement :BaseClass

限制类型参数必须是继承自指定的基类,或是基类本身
where T:接口名

class Stack<TElement> where TElement :IInterface

限制类型参数必须是实现指定接口,或是指定接口
where T:new()

class Stack<TElement> where TElement :new()

限制类型参数必须具有无参构造函数

泛型约束的意义

泛型约束可以保证传递的类型参数符合一定的条件,并且在编译阶段就可以进行验证:例如添加T: new()约束可以保证传递的类型参数一定包含无参构造函数,添加基类约束可以保证类型一定派生自某个基类。
有了上面的保证,我们就可以在泛型类中调用T类型的构造函数,或者调用其基类的方法。
例如:

为Stack类添加约束
(注意构造器约束需要放在最后)

 public class Stack<TElement> where TElement :Paper,new()
{
        public TElement[] Elements { get; set; }
        public int Current { get; set; }
        public Paper Pop()
        {
            TElement element = new TElement();
            element = Elements[Current];
            return element.DrawOutTissue();
        }
        public void Push(string element)
        {
        }
    }
 public class Paper
{
        Paper()
        {
        }
        Paper DrawOutTissue()
        {
            return new Paper();
        }
    }
泛型约束的一些复杂情况
多个约束

对一个泛型参数可以添加多个约束,例如,可以同时为上述”class Stack “ 添加 class,new(),Paper,
但是:

  • 不可能同时添加struct和class约束
  • 不可能添加多个基类约束
  • 约束之间是 and 关系,不能添加or关系的约束
  • 构造器约束必须最后
  • 构造器约束只能指明无参构造器
  • 约束不会继承
多个参数

对于一种表示“键值对”关系的泛型类KeyValue<TKey,TValue>,该类具有两个泛型参数TKey,TValue,要为其都添加约束,代码如下:

public class KeyValue<TKey,TValue> where TKey : new() 
                                                where TValue: Base,new()
手把手教你用gmid方法设计二级运放:从理论到仿真全流程(附避坑指南) 本文详细介绍了使用gmid方法设计二级运放的全流程,从理论到仿真实践,特别针对初学者常见问题提供避坑指南。通过系统化的晶体管尺寸确定技术,帮助工程师在性能、功耗和面积之间找到最佳平衡点,适用于模拟集成电路设计中的关键模块开发。 阅读详情

相关推荐

【2024保研经验帖】中科院信工所夏令营经验分享

中科院信工所夏令营经验分享,信工所夏令营据说只要报了就能进,这个是不是真的尚不清楚,不过qq群里有八九百个人,也属实可怕。招生老师说我们这届夏令营招200-300个左右,于是又开始惶惶不安。 夏令营时期都是线上进行,先是每个科室进行线上招生宣讲,然后报名第一志愿部门和第二志愿部门,不同部门的考核是不同的。有的部门只要求英语面试和综合面试,有的部门除了面试还需要机试,而有的部门除了这些还需要笔试。

m0_63002183的博客 4489

C#中的泛型

编写程序时,经常遇到两个模块的功能非常相似,区别只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,我们只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。ArrayList不是类型安全的,使用时很可能出现类型不匹配的错误,就算都插入了同一类型的数据,使用时我们也需要将它们转化为对应的原类型来处理。泛型类的定义与泛型方法类似,是在泛型类的名称后面加上<T>,当然,也可以定义多个类型,即“<T1,T2,・・・>“ArrayList 存储在装箱和拆箱操作,导致其性能低下。

AuraroTeen的博客 5204

vc mfc listctrl使用虚拟列表 虚拟列表用法

note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 使用SetItemCount函数告诉listctrl当前显示多少行 使用虚拟列表需要自己维护数据源 使用 添加list ctrl 控件 将其Owner Data 属性 设置为 True 添加...

知其所以然 397

C#泛型的理解

泛型的概念 定义:泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程 序中使用它的时候。(也就是说泛型是可以与任何数据类型一起工作的类或方法)模块内高 内聚,模块间低耦合。 泛型的使用:当我们的类/方法不需要关注调用者传递的实体是什么(公共基类工具 类),这个时候就可以使用泛型。 注意: 集合中的项允许是 object 型的值,因此可以存放任意类型的值,无法确保存入集合中 的值都是同一类型,而导致在处理时发生异常。 可空类型 对于引用类型的变量来说,如果未对其赋值,在默认情况下

qq_57767445的博客 2450

Plant Simulation新手入门:从零开始搭建工厂布局仿真模型(附完整代码)

本文为Plant Simulation新手提供了一个从零开始搭建工厂布局仿真模型的完整实战教程。通过一个玩具工厂车间布局优化的具体案例,详细讲解了从数据准备、模型构建、核心逻辑编程到连接遗传算法进行自动优化的全流程,并附有完整代码示例,帮助读者快速掌握这一工业仿真软件的核心应用。

metal的博客 553

URDF模型转换实战:解决SolidWorks到Gazebo的五大常见问题

本文详细解析了从SolidWorks导出URDF模型到Gazebo仿真过程中常见的五大问题及解决方案,包括插件安装、坐标系建立、Link与Joint配置等关键步骤。通过实战经验分享,帮助机器人仿真工程师高效完成模型转换,确保Gazebo仿真准确性。

weixin_29052717的博客 442

C# 泛型详解(泛型类,方法,接口,委托,约束,反射 )

泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。...............

熊思雨的博客 2万+

别再踩坑了!Win10下用阿狸狗V3.2.6安装Cadence SPB 17.4的保姆级避坑指南

本文提供了Win10系统下使用阿狸狗V3.2.6安装Cadence SPB 17.4的详细避坑指南,涵盖环境准备、安装失败清理、分步安装与问题诊断、授权配置及典型故障排除等内容,帮助用户顺利完成安装并避免常见错误。

weixin_32576389的博客 359

C#高级--泛型详解

C#高级–泛型详解 一、泛型是什么? 泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类型参数的办法呢?泛型的出现就是专门来解决这个问题的。 使用泛型是一种增强程序功能的技术,具体表现在以下几个方面: 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。 您可以创建泛型集合类。

李宥的博客 1万+

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

大语言模型在金融风险预警中的推理应用探索

金融行业一直面临着各种风险,如信用风险、市场风险、操作风险等。准确及时的风险预警对于金融机构的稳定运营和投资者的利益保护至关重要。传统的金融风险预警方法主要基于结构化数据和统计模型,虽然在一定程度上能够识别风险,但对于非结构化数据的处理能力有限,难以捕捉到复杂的风险因素和潜在的风险趋势。大语言模型作为自然语言处理领域的重要突破,具有强大的语言理解和生成能力,能够处理各种形式的文本数据。

AI天才研究院 1167

C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、 泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

dotNet全栈开发 4万+

PyTorch 最新安装教程(2021-07-27)

PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 23万+

C#的泛型约束

可以看到,直接在编译阶段就报错,而错误原因是string类型可以为null,值类型不能为null,因为我们在创建泛型类时进行了值类型约束,所以非值类型不可用。泛型约束是C#泛型编程中的核心机制,它允许开发者限制泛型类型参数可以接受的类型范围,从而在编译时提供更强的类型安全性和更丰富的功能支持。class B<T> where T : struct//值类型约束只能放入值类型的参数。接口的实现和继承具有相似性,只要是实现了接口的类都可以作为参数输入,这边主要看多个约束的实现。b.Add1("张三");

dcy20040821的博客 1822

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#—泛型约束

泛型约束就是告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。当分配给泛型的类型参数不满足约束的类型时,编译器会报出 Compiler Error CS0452 的错误。在 C# 中允许使用 where 上下文关键字指定约束,让泛型的类有一定的限制。

qq_3517289697的博客 1587

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【笔记】C# 泛型约束

🗽 泛型约束就是告知编译器类型参数必须具备的功能。在没有任何约束的情况下,类型参数可以是任何类型。编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。当分配给泛型的类型参数不满足约束的类型时,编译器会报出 Compiler Error CS0452 的错误。在 C# 中允许使用 where 上下文关键字指定约束。表示为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

好学若饥,谦卑若愚。 3817

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#进阶学习(二)泛型及泛型约束的认识

C#泛型允许通过类型参数(如T)定义类、方法、接口,使用时指定具体类型,避免装箱拆箱并提升类型安全。泛型类(如Stack<T>)实现逻辑复用,泛型方法支持灵活操作,泛型接口(如IRepository<T>)定义通用契约。约束机制(where T : constraint)限制类型参数范围,确保支持特定操作(如IComparable)。相比非泛型方案,泛型消除运行时类型风险,提升性能,是集合、设计模式等场景的核心技术。

FAREWELL00075的博客 1403

C#五大泛型约束

C#六大泛型约束基类约束接口约束new()构造函数约束引用/值类型约束组合约束 基类约束 基类约束有两个功能,首先,它允许泛型类使用基类约束所定义的的成员,第二个功能是确保泛型类使用指定基类的类型实参,这意味着,在使用泛型类时,类型实参必须是基类本身或者是派生自该基类的类。 class Program { static void Main(string[] args) ...

qq_43893500的博客 7286

C# 泛型约束讲解

C# 泛型约束讲解为什么加约束约束关键字格式约束类型关键字各各类型实例值类型约束 ==struct==引用类型约束 ==class==无参构造函数 ==new()==某一类本身或者其派生类 ==T:类名==某一接口其派生类 ==T:接口名==另一泛型类型本身或者派生类型 ==T:K==字母多重约束单一字母多重约束不可组合类型例子顺序组合错误多个字母多重约束 为什么加约束 当我们用约束很爽的时候,有人说适当的加上约束比较好。可是为什么呢? 因为泛型是可以任意类型的,此时就有潜在的危险,当我们滥用泛

m0_48554728的博客 2209

C# 中泛型编程之泛型类、泛型方法、泛型约束详解

类型Type现在可以表示带有特定类型的实参(或绑定类型)或未指定类型的泛型(或称未绑定类型)。委托级别的约束只在声明委托变量和实例化委托时使用,类似于在类型和方法的作用范围中实施的其他任何约束。同时子类中的泛型方法不能重复基类泛型方法的约束,这一点和泛型类中的虚方法重写是有区别的,代码如下。////错误 重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定这些约束。类型参数必须具有无参数的公共构造函数。3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)

u011555996的博客 2886

c#泛型约束

泛型约束的使用以及可作用场景

LM001_csdn的博客 2724

C# 泛型编程之泛型类,泛型方法,泛型约束

  所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。   泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。在定义泛型类时,在对客户端代码能够在实例化类时,可以用类型参数的类型种类施加限制。

weixin_42565127的博客 2235

C#泛型和泛型约束

一、泛型:     所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 二、泛型约束: 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。     下表列出了五种类型的约束: 约束 说明 ...

songjuntao8的专栏 864

C#中的泛型(约束、逆变、协变)

在 C# 中泛型是一项强大的特性,它允许你创建通用的类、接口、方法、委托等,这些通用的结构可以处理多种不同的数据类型,而无需为每种类型编写重复的代码。

Good_1001的博客 1964

C#泛型约束

泛型的六种约束

qq_60069700的博客 6538

C# 泛型类型的约束详解与示例

泛型约束用于限制可以用于泛型参数的类型。通过使用约束,我们可以确保在泛型类型中可以调用特定类型的方法,从而提高代码的健壮性。类约束:指定泛型参数必须是某个类或其派生类。接口约束:指定泛型参数必须实现某个接口。引用类型约束:指定泛型参数必须是引用类型。值类型约束:指定泛型参数必须是值类型。无参数构造函数约束:指定泛型参数必须有一个无参数的构造函数。多重约束:为一个泛型参数指定多个约束。默认构造函数约束:使用无参数构造函数约束来创建泛型集合类。

qq_35320456的博客 3832
上一篇: C# 特性
Codeeror
博客等级 码龄9年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值