C#委托(delegate)

概念:

委托(delegate):是一种引用类型的变量,用于存储某个方法的引用地址
C#中的委托(Delegate)是一种类型安全的对象,它可以存储对一个或多个方法的引用。委托可以像其他类型一样作为参数传递给方法,也可以用于回调函数和事件处理程序等场景。

委托的基本语法如下所示:

delegate returnType DelegateName(parameterList);

其中,returnType是委托所引用方法的返回类型,DelegateName是委托的名称,parameterList是委托所引用方法的参数列表。

委托的使用步骤如下:
1.声明委托类型:根据需要定义一个委托类型,在其中指定返回类型和参数列表。可以在类的内部或外部声明委托类型

delegate int CalculationDelegate(int a, int b);

2.创建委托对象:使用委托类型创建委托对象,可以使用构造函数或简化的语法

CalculationDelegate addDelegate = new CalculationDelegate(Add);

3.定义方法:定义与委托类型相匹配的方法,该方法的返回类型和参数列表必须与委托所引用的方法一致

int Add(int a, int b)
{return a + b;
}

4.调用委托:通过调用委托对象来执行委托所引用的方法

int result = addDelegate(5, 3);

委托可以引用单个方法,也可以引用多个方法。当委托引用多个方法时,称为多播委托(Multicast Delegate)。可以使用+=运算符将多个方法添加到委托中,使用-=运算符从委托中移除方法。

下面是一个多播委托的示例:

delegate void MessageDelegate(string message);void PrintMessage(string message)
{Console.WriteLine("Printing: " + message);
}void LogMessage(string message)
{Console.WriteLine("Logging: " + message);
}MessageDelegate messageDelegate = PrintMessage;
messageDelegate += LogMessage;messageDelegate("Hello"); // 调用所有引用的方法

除了普通委托,C#还提供了一些特殊的委托类型,如Action和Func。Action委托用于引用不返回值的方法,而Func委托用于引用具有返回值的方法。

例如,Action委托的声明如下(无返回值):

delegate void Action();

Func委托的声明如下(有返回值):

delegate TResult Func<out TResult>();
delegate TResult Func<in T, out TResult>(T arg);

C#委托编写一个回调函数

首先,声明一个委托类型,用于定义回调函数的签名:

delegate void CallbackDelegate(string message);

然后,编写一个接受委托作为参数的方法,该方法在完成某个操作后调用回调函数:

void PerformOperation(int value, CallbackDelegate callback)
{// 模拟某个操作int result = value * 2;if(callback!=null{// 调用回调函数callback("操作结果为:" + result);}}

接下来,编写一个回调函数的具体实现:

void MyCallbackFunction(string message)
{Console.WriteLine("回调函数被调用:" + message);
}

最后,在主程序中调用PerformOperation方法,将回调函数作为参数传递进去:

//把MyCallbackFunction方法的引用地址赋值给CallbackDelegate 委托类型的变量
CallbackDelegate callbackDelegate = new CallbackDelegate(MyCallbackFunction);
//执行操作方法,在方法里面调用委托
PerformOperation(5, callbackDelegate);

运行程序,将会输出以下结果:

回调函数被调用:操作结果为:10

在这个示例中,我们定义了一个CallbackDelegate委托类型,它接受一个string类型的参数并且没有返回值。然后,我们编写了一个PerformOperation方法,该方法接受一个整数值和一个回调函数作为参数,并在执行某个操作后调用回调函数。最后,我们定义了一个MyCallbackFunction方法来实现回调函数的具体逻辑。在主程序中,我们创建了一个callbackDelegate委托对象,并将其作为参数传递给PerformOperation方法,从而实现了回调函数的调用。
这个示例展示了如何使用委托来实现回调函数,通过将委托对象作为参数传递给方法,可以在方法执行完毕后调用回调函数进行后续处理。

委托在C#中被广泛应用于事件处理、异步编程、LINQ和回调函数等场景。通过使用委托,可以实现代码的解耦和可扩展,并提高代码的可读性和可维护性

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

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

相关文章

热烈祝贺蜀益表面处理成功入选航天系统采购平台

经过航天系统采购平台的严审&#xff0c;眉山市蜀益表面处理科技有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企…

使用php实现微信登录其实并不难,可以简单地分为三步进行

使用php实现微信登录其实并不难&#xff0c;可以简单地分为三步进行。 第一步&#xff1a;用户同意授权&#xff0c;获取code //微信登录public function wxlogin(){$appid "";$secret "";$str"http://***.***.com/getToken";$redirect_uriu…

Linux文件管理知识:查找文件(第二篇)

上篇文章详细介绍了linux系统中查找文件的工具或者命令程序locate和find命令的基本操作。那么&#xff0c;今天这篇文章紧接着查找文件相关操作内容介绍。 Find命令所属操作列表中的条目&#xff0c;有助于我们想要的结果输出。上篇文章已讲到find 命令是基于搜索结果来执行操作…

Redis 介绍

一.Redis 介绍 Redis 和 Memcached 都是非关系型数据库也称为 NoSQL 数据库&#xff0c;MySQL、 Mariadb、SQL Server、PostgreSQL、Oracle 数据库属于关系型数据 关系型数据库(RDBMS, Relational Database Management System)。 1.1 Redis 介绍 Redis(Remote Dictionary Se…

Hadoop HA模式切换

Hadoop HA模式下 主从的切换&#xff08;操作命令&#xff09; YARN HA 获取所有RM节点的状态 yarn rmadmin -getAllServiceState获取 rm1 节点的状态 yarn rmadmin -getServiceState rm1手动将 rm1 的状态切换到STANDBY yarn rmadmin -transitionToStandby rm1 ##或者 y…

【LeetCode-中等题】236. 二叉树的最近公共祖先

文章目录 题目方法一&#xff1a;后序遍历 回溯 题目 方法一&#xff1a;后序遍历 回溯 解题的核心就是&#xff1a;采用后序遍历 讨论p&#xff0c;q是否在当前的root的两边&#xff0c;如在两边则返回当前节点root 如何不在两边&#xff0c;只要出现一个节点等于p或者q就…

OpenCV

文章目录 OpenCV学习报告读取图片和网络摄像头1.1 图片读取1.2 视频读取1.1.1 读取视频文件1.1.2读取网络摄像头 OpenCV基础功能调整、裁剪图像3.1 调整图像大小3.2 裁剪图像 图像上绘制形状和文本4.1 图像上绘制形状4.2图像上写文字 透视变换图像拼接颜色检测轮廓检测人脸检测…

前端无需install快速调试npm包,Console-Import使用

Console-Import是一个Chrome扩展插件&#xff0c;可以方便地从Chrome控制台导入JavaScript和CSS资源。它可以帮助我们在开发过程中快速调试和测试第三方库或代码。 下载地址 安装 要安装Console-Import&#xff0c;请在Chrome网上应用店搜索“Console-Import”&#xff0c;然…

微信小程序发布一个npm包

参考:https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 同npm一样流程 npm install weixin_heath_apis

使用Redis统计网站的UV/DAU

HyperLogLog/BitMap 统计UV、DAU需要用到Redis的高级数据类型 M public class RedisKeyUtil {private static final String PREFIX_UV "uv";private static final String PREFIX_DAU "dau";// a single days UVpublic static String getUVKey(String …

MySQL 8.1.0 推出 InnoDB Cluster 只读副本

全面了解 8.1.0 版本新功能&#xff1a;InnoDB Cluster 只读副本的相关操作。 作者&#xff1a;Miguel Arajo 高级软件工程师 / Kenny Gryp MySQL 产品总监 本文来源&#xff1a;Oracle MySQL 官网博客 * 爱可生开源社区出品。 前言 MySQL 的第一个 Innovation 版本 8.1.0 已…

基于JAVA SpringBoot和HTML婴幼儿商品商城设计

摘要 随着网络技术的发展与普遍,人们的生活发生了日新月异的变化,特别是计算机的应用已经普及到经济和社会的各个领域.为了让消费者网上购物过程变得简单,方便,安全,快捷,网上商城购物成了一种新型而热门的购物方式。网上商城在商品销售的发展中占据了重要的地位,已成为商家展示…

【Hello Algorithm】链表相关算法题

本篇博客介绍&#xff1a; 介绍下链表相关的算法题 链表相关算法题 快慢指针回文结构链表将单向链表按某值划分为左边小&#xff0c;中间相等&#xff0c;右边大的形式复制带随机指针的链表 链表相关的算法题其实都算不上难 我们真正要考虑的是一些边界问题 事实上链表题就是在…

【大数据】数据湖:下一代大数据的发展趋势

数据湖&#xff1a;下一代大数据的发展趋势 1.数据湖技术产生的背景1.1 离线大数据平台&#xff08;第一代&#xff09;1.2 Lambda 架构1.3 Lambda 架构的痛点1.4 Kappa 架构1.5 Kappa 架构的痛点1.6 大数据架构痛点总结1.7 实时数仓建设需求 2.数据湖助力于解决数据仓库痛点问…

5 大虚拟数字人工具:视频内容创作的未来

人工智能&#xff08;AI&#xff09;给视频内容创作领域带来了一场革命。这一领域的显着进步之一是人工智能生成的会说话的化身的出现&#xff0c;它已经成为制作高质量视频的游戏规则改变者&#xff0c;而无需专业演员或昂贵的视频编辑软件。在这篇博文中&#xff0c;我们将深…

python用 xlwings库对Excel进行 字体、边框设置、合并单元格, 版本转换等操作

xlwings 其他的一些单元格读取写入操作网上很多&#xff0c; 下面就写些如何设置单元格的 字体对齐&#xff0c;字体大小、边框&#xff0c; 合并单元格&#xff0c; 这些设置。 import xlwings as xwapp xw.App(visibleTrue, add_bookFalse) app.display_alerts False #…

leetcode455. 分发饼干 【贪心】

题目&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c…

Latex-遇到的各种公式

用的是OverLeaf。 Sigmoid的写法 \begin{equation} \sigma(x) \frac{1}{1 e^{-x}} \end{equation} Softmax的写法 \begin{equation} \sigma(t)_i \frac{e^{t_i}}{\sum\limits_{j1}^{N}e^{t_j}} \end{equation} 下标 用_符号 例子&#xff1a;argmax_y 上标 用^符号…

一次性重复性采购供应商

在企业采购的活动中&#xff0c;有很多物料的采购都是通过一次性的采购进行的&#xff0c;此类的采购活动基本不会重复的进行。这种类型的采购&#xff0c;就叫做一次性采购。提供此种采购的供应商&#xff0c;企业一般不需要对他进行一个复杂的认证工作&#xff0c;而应该以效…

算法系列-力扣876-求链表的中间节点

# 求链表中间节点&#xff0c;如果有两个中间节点取后面那个 链表定义 // lc codestart /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val val; } * …