【一文了解】C#重点-委托1
本篇文章来学习一下C#的委托,委托是C#中的一个重要概念,它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C++中的函数指针,并且类型安全。
委托
1.委托的定义
委托(delegate)是方法的代理/代表,委托的是方法,当调用委托时就是调用了这个方法。委托是一类行为的抽象。是方法的引用,是一种数据类型。简而言之,委托是一种数据类型(关键字delegate);委托代表的是方法;当调用委托时就是调用了这个方法。
详细解释:
委托是【声明了返回类型和参数组成】一种数据类型;
委托代表【代理/表示】的是方法【代表和委托签名一致的任何方法,签名:返回类型和参数组成】、【委托是一类行为的抽象】
当调用委托时就是调用【间接调用】了这个方法。【因为委托能存储方法的地址(引用)】
2.签名
2.1签名定义
签名(Signature)通常指的是方法、构造函数、委托、事件等的名称、参数类型和返回类型的组合。签名用于唯一标识一个方法或函数,帮助编译器和运行时区分不同的方法或函数。
2.2方法签名的组成部分
①方法名:方法的名称,通常用于标识该方法。
②参数列表:方法的参数类型及其顺序,不包括参数的名称,但包括参数的类型。
③返回类型:方法的返回类型,但不包括方法的访问修饰符(如public、private等)和static修饰符。
注意,方法签名并不包括访问修饰符、返回类型、static或virtual等修饰符,只关注方法的名称和参数列表。
2.3签名举例
示例1:简单方法签名
public int Add(int a, int b)
{return a + b;
}
方法名称:Add
参数列表:int a, int b(顺序和类型都很重要)
返回类型:int(方法返回 int 类型的值)
方法的签名:Add(int, int)。
示例2:不同签名
public int Add(int a, int b)
{return a + b;
}public double Add(double a, double b)
{return a + b;
}
这两个方法虽然名称相同(Add),但由于它们的参数类型不同,因此它们的签名是不同的:
Add(int, int):接受两个int类型的参数,返回int类型。
Add(double, double):接受两个double类型的参数,返回double类型。
因此,尽管方法名称相同,但它们的签名不同,所以是不同的方法。
示例3:委托的签名
委托的签名是指它所引用的方法的签名。委托签名包括方法的返回类型和参数类型,而不包括委托本身的名称或其他修饰符。
public delegate int AddHandler(int x, int y);
这个委托AddHandler的签名是:int AddHandler(int, int)。这意味着它可以引用任何返回类型为int且接受两个int型参数的方法。委托名称AddHandler并没有被包括在签名中。签名仅描述方法的“形态”。
绑定到方法:
AddHandler addHandler = Add;
如果Add方法的签名与委托签名匹配,绑定是合法的。
3.委托的3个基本使用步骤
3.1定义委托
在定义端定义委托,,习惯命名XXXHandler:如SelectHandler,delegate前可以有访问修饰符,默认为internal,定义格式如下
delegate 返回类型 委托类型名(形参列表);
delegate void Handler();
3.2创建实例
在调用端创建实例,即实例化委托,为委托指定/绑定方法
Handler handler = new Handler(Fun);//所在类的静态方法Fun的调用
Handler handler = new Handler(A.FunA);//类A的静态方法FunA的调用
3.3调用委托
在调用端调用委托,调用委托和调方法相似,有参数就要写参数,有返回值就可以返回
handler();
4.委托的使用
例1:基本语法的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DelegatePro
{//调用端class DelegateDemo1{static void Main(string[] args){//②实例化委托//Handler handler = new Handler(Fun);//输出:使用委托,调用FunHandler handler = new Handler(A.FunA);//输出:使用委托,调用类A的FunA//③调用委托handler();}static void Fun(){Console.WriteLine("使用委托,调用Fun");Console.ReadLine();}}//定义端//①定义委托delegate void Handler();class A{public static void FunA(){Console.WriteLine("使用委托,调用类A的FunA");Console.ReadLine();}}
}
例2:使用委托实现两数(int)相加
定义一个两数相加的方法 int(int,int),使用委托来调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DelegatePro
{//调用端class DelegateDemo2{static void Main(string[] args){//②实例化委托Handler handler = new Handler(A.Add);//③调用委托int sum=handler(1,2);//3}}//定义端//①定义委托delegate int Handler(int a,int b);class A{public static int Add(int a,int b){return a + b;}}
}
4.委托的分类
4.1单播委托
一个委托对象只关联一个方法->单播调用。
using System;public class DelegatePro
{//调用端class DelegateDemo3{//②实例化委托//创建一个单播委托,指向 GreetHello 方法GreetDelegate greet = new GreetDelegate(GreetHello);//③调用委托greet("Alice"); //输出: Hello, Alice}//定义端//①定义委托public delegate void GreetDelegate(string name);public static void GreetHello(string name){Console.WriteLine("Hello, " + name);}
}
4.2多播委托
一个委托对象关联多个方法,只返回最后方法的结果->多播调用。
using System;namespace DelegatePro
{//调用端class DelegateDemo4{static void Main(string[] args){//②实例化委托//创建一个多播委托,指向 Add和 Division 方法Handler handler = new Handler(A.Add);//使用 += 将方法添加到委托中handler += new Handler(A.Division);//③调用委托int res=handler(6,2);//3}}//定义端//①定义委托delegate int Handler(int a,int b);class A{public static int Add(int a,int b){return a + b;}public static int Division(int a, int b){return a / b;}}
}
上述res的结果为3,因为handler是一个多播委托,它依次调用A.Add和A.Division方法。在多播委托中,只有最后一个方法的返回值会被保留。如果需要处理多播委托中所有方法的返回值,需要额外的逻辑来收集它们。所以A.Division返回的3。
因此,委托有返回值不适合多播执行,委托无返回值适合多播执行。
好了,本次的分享到这里就结束啦,希望对你有所帮助~
相关文章:

【一文了解】C#重点-委托1
本篇文章来学习一下C#的委托,委托是C#中的一个重要概念,它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针,并且类型安全。 委托 1.委托的定义 委托(delegate)是方法的代理/代表,委托…...

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)
文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…...

新版Android Studio 2024.1.2版本,如何通过无线wifi连接手机实现交互
1、首先,先确定手机是否启动了开发者选项 在我的设备 -> 全部参数 -> MIUI版本点击6下 (有的手机是 关于手机 -> 查看手机版本 ) 2、在设置中搜索 开启开发者选项 3、进入开发者选项后,在 调试 中选择 无线调试并选择…...

VTK知识学习(26)- 图像基本操作(一)
1、前言 图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。 2、图像信息的访问与修改 1)利用vtkIamgeData…...

2024年9月AI头条新闻:创新与挑战并存
2024年9月AI头条新闻:创新与挑战并存 9月,人工智能领域继续高速发展,重大产品发布、伦理争议和技术突破交织在一起。让我们回顾一下本月最重要的AI新闻: OpenAI的o1:更强大的语言模型 OpenAI推出了o1,一个…...

[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
前言 xshell 链接:https://pan.quark.cn/s/57062561e81a 提取码:TK4K 链接失效(可能被官方和谐)可评论或私信我重发 安装 下载后解压得到文件 安装路径不要有中文 打开文件 注意!360等软件会拦截创建注册表的行为&a…...

count(1)、count(_)与count(列名)的区别?
大家好,我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别?】面试题。希望对大家有帮助; count(1)、count(_)与count(列名)的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中,…...

代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
贪心没有套路,说白了就是常识性推导加上举反例 今天的内容比较简单 简单了解贪心是通过局部最优解反推全局最优解(有经验成分) 455.分发饼干 题目链接:455. 分发饼干 - 力扣(LeetCode) 讲解链接ÿ…...

List直接使用removeAll报错
List直接使用removeAll报错 需要先将list转换才能使用 原因是: removeAll 方法在 Java 中用于从当前列表中删除另一个列表中存在的所有元素。如果直接对 List 接口的一个实现使用 removeAll 方法抛出异常,可能的原因有: 不同的List实现&am…...

Debian环境安装Docker Engine
Debian环境安装Docker Engine 卸载旧版本使用APT工具安装Docker设置存储库安装Docker设置权限 docker compose命令卸载Docker 卸载旧版本 要卸载的非官方软件包是: docker.iodocker-composedocker-docpodman-docker 此外,Docker Engine 依赖 containe…...

Python常用内置函数总结
目录 1. abs() 2. complex() 3. divmod() 4. eval() 5. float() 6. hash() 7. input() 8. int() 9. len() 10. list() 11. oct() 12. open() 13. pow() 14. print() 15. range() 16. reversed() 17. round() 18. sorted()…...

深入了解蓝牙Profile类型与设备的对应关系
在现代技术中,蓝牙作为一种无线通信技术,广泛应用于各种设备之间的短距离通信。不同的设备在连接时使用不同的蓝牙Profile(配置文件),每种Profile都为特定的设备功能提供支持,例如音频流传输、语音通话、文件传输等。在本文中,我们将详细介绍蓝牙Profile的常见类型及其对…...

[bug]java导出csv用Microsoft Office Excel打开乱码解决
[bug]java导出csv用Microsoft Office Excel打开乱码 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, 他用Microsoft Office Excel打开之后出现乱码,如下图…...

2023年区块链职业技能大赛——区块链应用技术(一)模块一
模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和…...

4 软件工程——总体设计
一、设计过程 1.两个主要阶段 系统设计阶段:确定系统的具体实现方案结构设计阶段:确定软件结构 2.九个步骤 设想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构设计数据库制定测试计划书写文档审查和复审 二、设计原理 1.模块化 模块…...

Elasticsearch:确保业务规则与语义搜索无缝协作
作者:来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读: Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则(query ru…...

【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧
【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧 目录 文章目录 【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧目…...

【LuaFramework】LuaFramework_UGUI_V2框架学习
GitHub - jarjin/LuaFramework_UGUI_V2: 基于tolua的热更新框架V2 旧版本是Unity 5.0,这个是新版本支持更高版本的 导入工程后先清除wrap 然后重新生成wrap,你会发现有个报空null,框架的问题总结下所有的框架wrap相关报错问题和修复方法&…...

使用 AOP 在 Spring Boot 中实现跟踪和日志记录
在现代应用程序中,尤其是使用微服务构建的应用程序,跟踪和日志记录在跟踪流经各种服务的请求方面起着至关重要的作用。跟踪可帮助开发人员诊断问题、监控性能并了解用户在多个系统中的旅程。 在此博客中,我们将介绍如何使用traceId从前端生成…...

如何永久解决Apache Struts文件上传漏洞
Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来,就存在多个版本的漏洞,其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制,从而上传恶意文件。虽然每次官方都发布补丁进行修…...

FPGA远程升级 -- FLASH控制
简介 前文讲到如何实现XILINX芯片程序跳转,但升级程序是事先通过VIVADO工具将两个程序合成一个BIN文件实现升级的,并不能在线更新升级。要实现远程升级的能力需要对FPGA的FLASH进行在线写入升级程序。 FLASH介绍 本次设计FLASH选用的是S25FL128芯片&…...

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商
吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程分为两大部分:面向全体团队成员的AI大模型技术结构与行业应用,以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…...

ARM异常处理 M33
1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类:预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看,获取更信息的异常原因: CFSR是由UFSR、BFSR和MMFSR组成: 下面列举HFSR、MMFSR、…...

(补)算法刷题Day24: BM61 矩阵最长递增路径
题目链接 思路 方法一:dfs暴力回溯 使用原始used数组4个方向遍历框架 , 全局添加一个最大值判断最大的路径长度。 方法二:加上dp数组记忆的优雅回溯 抛弃掉used数组,使用dp数组来记忆遍历过的节点的最长递增路径长度。每遍历到已…...

探索 Bokeh:轻松创建交互式数据可视化的强大工具
探索 Bokeh:轻松创建交互式数据可视化的强大工具 在数据科学和数据分析领域,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强大的 Python 库,它可以帮助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。…...

【Rust自学】6.1. 定义枚举
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.1.1. 什么是枚举 枚举允许我们列举所有可能的值来定义一个类型。这与其他编程语言中的枚举类似,但 Rust 的枚举更加灵活和强…...

【Java基础面试题035】什么是Java泛型的上下界限定符?
回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制,主要有上界限定符和下届限定符。 1)上界限定符 (? extends T): 定义:通配符?的类型必须是T或者T的子类,保证集合元素一定是T或者T的子类作用&…...

0基础学前端系列 -- 深入理解 HTML 布局
在现代网页设计中,布局是至关重要的一环。良好的布局不仅能提升用户体验,还能使内容更具可读性和美观性。HTML(超文本标记语言)结合 CSS(层叠样式表)为我们提供了多种布局方式。本文将详细介绍流式布局、Fl…...

【python高级】342-TCP服务器开发流程
CS模式:客户端-服务端模式 TCP客户端开发流程介绍(五步)(C端) 1.创建客户端套接字对象 2.和服务端套接字建立连接 3.发送数据 4.接收数据 5.关闭客户端套接字 TCP服务端开发流程(七步)…...

《计算机组成及汇编语言原理》阅读笔记:p48-p81
《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a lar…...