C#委托—马工教你轻松玩转委托
前言
在C#中有一个小白谈之色变的知识点叫委托,很多学了一两年C#的还不知道委托究竟是什么东西,本文就来帮你彻底解开解惑,从此委托就是小儿科!
1、委托的本质
委托也是一种类型,大家知道所有的类型一定对应一种数据,比如Int类型,那么它对应的就是Int类型的数据,委托对应的是什么类型的数据呢?委托对应的是方法类型,由于委托是一个引用类型,所以它存储的就是方法的地址,我们操作委托实际上就是操作方法。
2、自定义一个无返回值的委托类型
在C#中我们使用delegate 关键字来定义委托类型,由于委托对应的是方法,也就是所谓的函数,那么大家知道方法是分为有返回值的方法和无返回值的方法的。下面就使用delegate 关键字来定义一个无返回值的委托类型,具体如下:
2.1 定义一个委托类
这里使用了void 代表方法无返回值,然后OutputValueDelegate是类名,int x,int y代表这个方法包含两个int类型的参数。
public delegate void OutputValueDelegate(int x, int y);//声明一个无返回值的委托类型
2.2 声明一个委托类型的对象
OutputValueDelegate outputValueDelegate;//定义一个委托类型的对象
2.3 定义一个委托类型匹配的方法
定义一个无返回值,有两个Int类型参数的方法
private void OutputValue(int x, int y){Console.WriteLine(x + y);}
2.4 为委托类型的变量赋值
由于委托对应的就是方法,所以这里将方法名称直接赋值给委托对象即可,如下:
outputValueDelegate = OutputValue;
2.5 调用委托
调用委托实际上就是调用委托对应的方法,由于绑定的方法是将传入的两个值相加,所以最后得到的值是3。
outputValueDelegate(1, 2);
输出:
3
3、自定义一个有返回值的委托类型
3.1 定义一个委托类
可以看到下面定义的一个委托类型返回值是int类型,和无返回值委托类型相比,将void关键字变成了int。
public delegate int GetMaxValueDelegate(int x, int y);//声明一个有返回值的委托类型
3.2 声明一个委托类型的对象
GetMaxValueDelegate getMaxValueDelegate;//定义一个委托类型的对象
3.3 定义一个委托类型匹配的方法
定义一个无返回值,有两个Int类型参数的方法
private int GetMax(int x, int y){return x > y ? x : y;}
3.4 为委托类型的变量赋值
由于委托对应的就是方法,所以这里将方法名称直接赋值给委托对象即可,如下:
getMaxValueDelegate = GetMax;
3.5 调用委托
调用委托实际上就是调用委托对应的方法,由于绑定的方法是获取两个输入值的最大值,所以最后得到的值是2。
int val = getMaxValueDelegate(1, 2);Console.WriteLine(val);
输出:
2
4、使用系统自带的无返回值委托类型
在C#中提供了一种无返回值委托类型叫Action,这样我们就不用自己去定义委托类型了,使用过程如下。
4.1 声明一个委托类型的对象
Action<int, int> outputValueAction;//定义一个无返回值的委托对象
4.2 定义一个委托类型匹配的方法
定义一个无返回值,有两个Int类型参数的方法
private void OutputValue(int x, int y){Console.WriteLine(x + y);}
4.3 为委托类型的变量赋值
由于委托对应的就是方法,所以这里将方法名称直接赋值给委托对象即可,如下:
outputValueAction = OutputValue;
4.4 调用委托
调用委托实际上就是调用委托对应的方法,由于绑定的方法是将传入的两个值相加,所以最后得到的值是3。
outputValueAction(1, 2);
输出:
3
5、使用系统自带的有返回值委托类型
在C#中提供了一种有返回值委托类型叫Func,这样我们就不用自己去定义委托类型了,使用过程如下。
5.1 声明一个委托类型的对象
这里注意Func的最后一个参数是返回值类型,前面的是方法的参数类型
Func<int, int, int> getMaxValueFunc;//定义一个有返回值的委托对象(最后一个参数是返回值)
5.2 定义一个委托类型匹配的方法
定义一个无返回值,有两个Int类型参数的方法
private int GetMax(int x, int y){return x > y ? x : y;}
5.3 为委托类型的变量赋值
由于委托对应的就是方法,所以这里将方法名称直接赋值给委托对象即可,如下:
getMaxValueFunc = GetMax;
5.4 调用委托
调用委托实际上就是调用委托对应的方法,由于绑定的方法是获取两个输入值的最大值,所以最后得到的值是2。
int val = getMaxValueFunc(1, 2);Console.WriteLine(val);
输出:
2
作者介绍
马工2017年硕士毕业,一直从事上位机软件开发工作,在我工作的第四年年薪突破了40万+,为了帮助跟我一样从底层出身的上位机软件工程师早日达到高级工程师的水平,早日找到30万+的工作,我根据多年项目经验,总结出了一系列可直接用于项目的C#上位机实战教程推荐给大家,目前在CSDN已经超过一千人订阅,如果你不甘贫庸,想像我一样早日拿到高薪,马工强烈推荐你早日学这套教程,雷军曾说这个世界上有99%的问题别人都遇到过,你要做的不是闷头干!而是找这个领域的专家问一下,这是最快速提升自己的方法!
年入30万+C#上位机实战必备教程推荐
1、《C#串口通信从入门到精通》
2、《 C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《 C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
相关文章:
C#委托—马工教你轻松玩转委托
前言 在C#中有一个小白谈之色变的知识点叫委托,很多学了一两年C#的还不知道委托究竟是什么东西,本文就来帮你彻底解开解惑,从此委托就是小儿科! 1、委托的本质 委托也是一种类型,大家知道所有的类型一定对应一种数据…...
当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
目录 模型生成效果展示(prompt 全公开) 如何注册 Stable Diffusion 使用 SD(dreamstudio.ai )的收费标注如何 SD 提供哪些参数可以设置 如何使用种子来改进一张作品 我用 SD 创作的图片著作权如何归属,可以拿来商…...
NPM 使用教程:从入门到精通
NPM 使用教程:从入门到精通 1. 引言 什么是 NPM? NPM (Node Package Manager) 是 JavaScript 的包管理工具,也是世界上最大的开源库生态系统。它帮助开发者轻松地管理项目的依赖、安装和分享包。NPM 与 Node.js 紧密结合,并在开…...
基于ssm+vue+uniapp的停车场小程序的设计与实现
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
C语言典型例题37
《C程序设计教程(第四版)——谭浩强》 例题3.5 按照按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为 60~69分,D等在60分以下,成绩的等级从键盘输入 代码: //…...
二自由度机械臂软件系统(三)ros2_control硬件底层插件
ros2_control实现了两个功能,一个是控制算法插件即控制的实现,另一个是底层插件即跟硬件通信的功能。 参考资料:https://zhuanlan.zhihu.com/p/682574842 1、创建功能包 ros2 pkg create --build-type ament_cmake robot_control_test在sr…...
24.8.9.11数据结构|链栈和队列
链栈 1、理解 实际上是一个仅在表头进行操作的单链表,头指针指向栈顶结点或头结点,以下恋栈均指带头结点的链栈. 2、 基本操作 1、定义结构:节点含有数据域和指针域 2、初始化操作:建立一个带头结点的空栈 3、取栈顶元素操作:取出栈的栈顶元…...
StarSpider:一款高效的网络爬虫框架解析与实战
文章目录 引言官网链接StarSpider 原理简介基础使用1. 添加依赖2. 编写PageProcessor3. 启动爬虫 高级使用1. 分布式抓取2. 自定义下载器3. 深度定制 优点结语 引言 在大数据时代,数据成为了推动业务增长和创新的关键。网络爬虫作为数据获取的重要手段之一…...
LVS详细解析及其NAT模式与DR模式部署(理论+实验全方位指导)
目录 1. 集群 2. 分布式系统 3. 集群与分布式的比较 4.通俗的解释 集群 分布式系统 总结 LVS(Linux Virtual Server)简介 LVS专业术语 工作原理 LVS调度算法 静态调度算法 动态调度算法 ipvsadm脑图 NAT模式集群 LVS的配置 在LVS主机内打开…...
负载均衡相关概念介绍(一)
负载均衡(Load Balance)是集群技术的一种重要应用,旨在将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而提高系统的并发处理能力、增加吞吐量、加强网络处理能力,并提供故障转移以…...
二叉树详解(1)
文章目录 目录1. 树的概念及结构1.1 树的相关概念1.2 树的表示1.3 树在实际中的运用(表示文件系统的目录树结构) 2. 二叉树的概念及结构2.1 概念2.2 特殊的二叉树2.3 二叉树的存储结构 3. 二叉树的顺序结构及实现3.1 二叉树的顺序结构3.2 堆的概念及结构…...
Spring定时任务注解
Service EnableScheduling public class xxxServiceImpl implement xxxService{Scheduled(cron "0 15 11 * * ?") // 每天的11:15执行public void reportCurrentTime() {aaa();}Scheduled(cron "0 15 17 * * ?") // 每天的17:15执行public void report…...
数据结构-绪论
学习目标: 认识数据结构的基本内容 学习内容: 了解:数据结构的研究内容掌握:数据结构的基本概念和术语了解:数据元素间的结构关系掌握:算法及算法的描述 数据结构的发展: 数据结构的发展简史 …...
Web开发:web服务器-Nginx的基础介绍(含AI文稿)
目录 一、Nginx的功能: 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件(夹)的作用: 五、常用命令 一、Nginx的功能: 1.反向代理:例如我有三台服务器&#x…...
共享经济背景下校园、办公闲置物品交易平台-计算机毕设Java|springboot实战项目
🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…...
Linux 服务器上简单配置 minio
Linux 服务器上简单配置 minio 初始化结构目录 mkdir -p /data/minio/bin mkdir -p /data/minio/conf mkdir -p /data/minio/data 下载 minio cd /data/minio/bin curl -O https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限 chmod x minio 创建配置文件…...
TypeScript 面试题汇总
引言 TypeScript 是一种由微软开发的开源、跨平台的编程语言,它是 JavaScript 的超集,为 JavaScript 添加了静态类型系统和其他高级功能。随着 TypeScript 在前端开发领域的广泛应用,掌握 TypeScript 已经成为很多开发者必备的技能之一。本文…...
杰卡德系数
杰卡德系数(Jaccard Index 或 Jaccard Similarity Coefficient) 杰卡德系数是一种用于衡量两个集合相似度的重要指标。 从数学定义上来看,如前面所述,杰卡德系数计算公式为: J ( A , B ) ∣ A ∩ B ∣ ∣ A ∪ B ∣…...
微服务实现-sleuth+zipkin分布式链路追踪和nacos配置中心
1. sleuthzipkin分布式链路追踪 在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。 这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软…...
数学中常用的解题方法
文章目录 待定系数法应用示例1. 多项式除法2. 分式化简3. 数列通项公式 总结 递归数列特征方程特征根的求解通项公式的求解示例 错位相减,差分错位相减法差分的应用结合理解 韦达定理二项式定理二项式定理的通项公式二项式系数的性质应用示例 一元二次求解1. 因式分…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
