深入理解C#中委托的使用及不同类型委托的应用示例

在C#中,委托是一种强大而灵活的机制,可以引用一个或多个方法,并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用,并介绍不同类型委托的应用示例。
在这里插入图片描述


目录

    • 1. 单播委托(Singlecast Delegate)
    • 2. 多播委托(Multicast Delegate)
    • 3. 泛型委托(Generic Delegate)
    • 总结

1. 单播委托(Singlecast Delegate)

单播委托是最简单的委托类型,它只能引用一个方法。以下是使用单播委托的示例代码:

delegate void MyDelegate(string message);class Program
{static void Main(string[] args){MyDelegate myDelegate = new MyDelegate(DisplayMessage);myDelegate("Hello, world!");}static void DisplayMessage(string message){Console.WriteLine(message);}
}

在上述示例中,我们定义了一个名为MyDelegate的单播委托类型,它可以引用一个没有返回值、接受一个字符串参数的方法。然后,我们创建了一个委托实例myDelegate,它引用了DisplayMessage方法。通过委托实例的调用,我们传递了一个字符串参数并执行了DisplayMessage方法。

2. 多播委托(Multicast Delegate)

多播委托是一种特殊的委托类型,可以引用多个方法,并按照添加的顺序依次调用这些方法。以下是使用多播委托的示例代码:

delegate void MyDelegate(string message);class Program
{static void Main(string[] args){MyDelegate myDelegate = null;myDelegate += DisplayMessage1;myDelegate += DisplayMessage2;myDelegate("Hello, world!");}static void DisplayMessage1(string message){Console.WriteLine($"Message 1: {message}");}static void DisplayMessage2(string message){Console.WriteLine($"Message 2: {message}");}
}

在上述示例中,我们定义了一个名为MyDelegate的多播委托类型,它可以引用一个没有返回值、接受一个字符串参数的方法。然后,我们创建了一个委托实例myDelegate,并将两个方法DisplayMessage1DisplayMessage2添加到委托实例中。通过委托实例的调用,我们会依次执行被引用的方法。

3. 泛型委托(Generic Delegate)

泛型委托是C#2.0新增的特性,它提供了一种类型安全的委托机制。可以将泛型委托理解为一种模板,可以用来引用任何可以匹配其签名的方法。以下是使用泛型委托ActionFunc的示例代码:

class Program
{static void Main(string[] args){Action<string> displayMessageAction = DisplayMessage;displayMessageAction("Hello, world!");Func<int, int, int> addFunc = Add;int result = addFunc(3, 5);Console.WriteLine($"The sum is {result}");}static void DisplayMessage(string message){Console.WriteLine(message);}static int Add(int a, int b){return a + b;}
}

在上述示例中,我们使用了ActionFunc这两个常用的泛型委托类型。Action<T>表示一个没有返回值且接受一个T类型参数的方法;Func<T1, T2, TResult>表示一个返回TResult类型值且接受T1T2类型参数的方法。通过泛型委托的使用,我们可以更加灵活地引用不同类型的方法。

总结

委托是C#中的重要特性,它提供了一种方便而强大的方式来引用和调用方法。本文详细介绍了单播委托、多播委托和泛型委托的使用,并提供了相应的示例代码。通过掌握委托的不同类型及其用法,您将能够更好地利用委托来解决各种编程问题,并提高代码的可扩展性和维护性。

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

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

相关文章

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码

众所周知&#xff0c;航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程&#xff0c;因此可利用虚拟仿真技术经济、安全及可重复性等特点&#xff0c;进行飞行任务或操作的模拟&#xff0c;以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合&#xf…

【吴恩达老师《机器学习》】课后习题5之【偏差与方差】

在本练习中&#xff0c;您将实现正则化线性回归&#xff0c;并使用它来研究具有不同偏差-方差特性的模型。 在练习的前半部分&#xff0c;您将实现正则化线性回归&#xff0c;利用水库水位的变化来预测从大坝流出的水量。在后半部分中&#xff0c;您将对调试学习算法进行一些诊…

[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?

How to Better Utilize Code Graphs in Semantic Code Search? [ESEC/FSE 2022] 语义代码搜索极大地促进了软件的重用&#xff0c;使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)丰富的表达能力&#xff0c;两种主流的研究工…

Flutter图标

https://fluttericon.cn/ Flutter 内置了丰富的图标。 Icon(Icons.ac_unit)

手机域名是什么?

随着移动互联网的迅猛发展&#xff0c;手机已经成为人们生活中不可或缺的一部分。无论是社交娱乐、在线购物还是工作沟通&#xff0c;手机都扮演着重要的角色。而在手机的世界中&#xff0c;域名作为连接用户和互联网的重要纽带&#xff0c;起着至关重要的作用。手机域名不仅简…

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站 CDN 内容分发网络&#xff1f; 当用户直接访问源站中的静态内容时&#xff0c;可能面临的体验问题&#xff1a; 客户离服务器越远&#xff0c;访问速度越慢。客户数量越多&#xff0c;网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…

idea中maven项目打包成jar,报错没有主清单属性解决方法

使用idea自带的打包可能会出现一下问题 在pom.xml中引入下面的依赖&#xff0c;即可解决 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions&…

MySQL数据库的存储引擎

目录 一、存储引擎概念 二、存储引擎 2.1MyISAM 2.11MyISAM的特点 2.12MyISAM表支持3种不同的存储格式&#xff1a; 2.2 InnoDB 2.21InnoDB特点介绍 三、InnoDB与MyISAM 区别 四、怎么样选择存储引擎 五、查看存储引擎 六、查看表使用的存储引擎 七、修改存储引擎 …

Java代码审计17之fastjson反序列化漏洞(2)

文章目录 1、类加载与反射调用1.1、类加载1.2、测试代码1.3、通过类的加载和反射调用evil类 2、Fastjson TemplatesImpl链调试2.1、链路总览2.2、调试构造利用链 3、fastjson反序列化TemplatesImpl 利⽤3.1、开启 Feature.SupportNonPublicField 得作用3.2、构造利用payload3.3…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…

MySQL(8) 优化、MySQL8、常用命令

一、MySQL优化 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 服务端参数配置&#xff1b; max_connections3000 连接的创建和销毁都需要系统资源&#xff0c;比如内存、文件句柄&#xff0c;业务说的支持…

Hello World启示录:Java编程的起点

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、Java基本结构1、一个简单的Java程序2、运行Java程序3、JDK | JRE | JVM之间的关系 二、代码注释标准1、注释规则2、注释规范…

Redis——jedis的set类型使用

sadd和smembers smembers的返回值是set类型 public static void saddAndSmembers(Jedis jedis){jedis.flushAll();jedis.sadd("key", "111", "222", "333");Set<String> result jedis.smembers("key");System.out.…

如何取消显示Notepad++每行显示的CRLF符号

新电脑中重新安装了Nodepad&#xff0c;打开记事本后发现出现了许多黑底的CR|LF标记&#xff0c;特别碍眼。 如何取消呢&#xff1f; 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果

010_第一代软件开发(二)

第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字&#xff1a; Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff…

法线贴图的视线原理

在上一篇文章中详细介绍了位移贴图的相关知识&#xff0c;在本章中我们继续讲述法线贴图的相关概念&#xff0c;文章后面继续用GLTF 编辑器 来演示下法线贴图的模型渲染效果。 1、什么是法线贴图 法线贴图&#xff08;Normal Map&#xff09;是一种纹理映射技术&#xff0c;用…

【kohya】训练自己的LoRA模型

文章目录 序言准备环境准备图片处理图片下载kohya_ss代码修改pyvenv.cfg启动界面访问地址生成字幕准备训练的文件夹配置训练参数开始训练遇到的问题&#xff1a; 序言 在把玩stable diffusion的webUI和comfyUI后&#xff0c;思考着自己也微调一个个性化风格的checkpoint、LyCO…

2023 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|数学建模完整代码+建模过程全解全析

问题一&#xff1a;区域碳排放量以及经济、人口、能源消费量的现状分析 思路&#xff1a; 定义碳排放量 Prediction 模型: CO2 P * (GDP/P) * (E/GDP) * (CO2/E) 其中: CO2:碳排放量 P:人口数量 GDP/P:人均GDP E/GDP:单位GDP能耗 CO2/E:单位能耗碳排放量 2.收集并统计相关…

8应用服务与领域服务

本系列包含以下文章&#xff1a; DDD入门DDD概念大白话战略设计代码工程结构请求处理流程聚合根与资源库实体与值对象应用服务与领域服务&#xff08;本文&#xff09;领域事件CQRS 案例项目介绍 # 既然DDD是“领域”驱动&#xff0c;那么我们便不能抛开业务而只讲技术&…

微信小程序demo 调用支付jsapi缺少参数 total_fee,支付签名验证失败 究极解决方案

坑一&#xff1a;调用支付jsapi缺少参数 total_fee 修正后的uniapp代码如下&#xff1a; uni.requestPayment({provider: wxpay,timeStamp: String(data.timestamp),nonceStr: data.nonceStr,package: prepay_id data.prepayId,signType: HMAC-SHA256,paySign: data.sign,su…