如何在 C# 中使用 委托

委托是一个类型安全的函数指针,它可以引用与委托具有相同签名的方法,你可以利用 委托 实现事件或者回调函数,多播委托 可以引用一个或者多个具有相同签名的方法。

理解 委托

本质上来说,委托包含了一个对方法的引用,概念上和 C ++ 上的函数指针是一样的,唯一不一样的是 C# 中的 委托 是类型安全的,你可以将方法作为参数传给 委托,而从让 委托 持有对方法的引用,委托常用于定义成 回调函数 和 事件处理,一般用 delegate 关键词去声明,可以将 delegate 定义成 类平级,也可以嵌套在 类中。

使用 委托 一般有以下三个步骤:

  • 初始化 declaration

  • 实例化 instantiation

  • 调用   invocation

委托签名的语法格式如下:


delegate result-type identifier ([parameters])

下面的代码展示了如何套用语法格式实现一个委托。


public delegate void MyDelegate(string text);

上面的代码可以看出,委托的名字为 MyDelegate, 它的返回值为 void,并且接收一个 string 类型的参数,这就意味着,委托需指向的方法也必须和这个委托具有相同的签名,上面只是 委托 的一个定义,要使用的话,还得塞入一个同签名的方法,代码如下。


MyDelegate d = new MyDelegate(ShowText);

一旦定义完成并且成功实例化后,接下来就可以执行这个委托了,如下代码所示:


d("Hello World...");

这里的 d 就是 委托实例,除了上面这种调用方法,还可以调用委托的 Invoke() 来执行委托所引用的方法。


d.Invoke("Hello World...");

如果你有一个方法接收两个参数作为入参,两个参数的累计值作为方法的返回值,那这种委托该怎么定义呢?完整代码如下:


using System;namespace Delegates
{public delegate int MyDelegate(int x, int y);class Program{static int Sum(int x, int y){return x + y;}static void Main(){MyDelegate d = new MyDelegate(Sum);           int result = d.Invoke(12, 15);Console.WriteLine(result);Console.ReadLine();}}
} 

委托实践

首先看下完整的代码清单。


using System;
namespace Delegates
{public delegate void MyDelegate(string text);class Program{public static void ShowText(string text){Console.WriteLine(text);}static void Main(){MyDelegate d = new MyDelegate(ShowText);d("Hello World...");Console.ReadLine();}}
}

值得注意的是,你可以使用 + 号将多个对象赋给一个 委托实例,这就让原来的 普通委托 成为了 多播委托,除了 + 号,也可以使用 Delegate 下的静态 Combine 方法 来合并多个 delegate 实例,有一点要注意,运行时委托会在内部维护了一个 list 集合来存放待执行的方法,下面的代码展示了如何使用 Combine 来合并多个 委托实例。


myDelegate d1 = new myDelegate(Method1);
myDelegate d2 = new myDelegate(Method2);
myDelegate multicastDelegate = (myDelegate)Delegate.Combine(d1, d2);
multicastDelegate.Invoke();

所谓的 多播委托 就是一个委托可以指向多个方法,值得注意的是,委托实例是不可变的,这就意味着从内部list 中 新增 或者 删除 一个委托实例,将会创建一个新的委托实例,从而变相的实现 list 的变更。

多播委托实践

下面的代码片段展示了一个多播委托,要注意这里的 委托实例 的用法,这里我使用了 += 操作符 实现将 多个具有相同签名的方法灌入到 委托实例 中。


using System;
namespace Delegates
{public delegate void MyDelegate();class Program{public static void Method1(){Console.WriteLine("Inside Method1...");}public static void Method2(){Console.WriteLine("Inside Method2...");}static void Main(){MyDelegate d = null;d += Method1;d += Method2;d.Invoke();Console.ReadLine();}}
}

事件驱动编程 模式中会大量使用委托,因为 委托 不需要关心它是被哪一个实例对象所引用,而只需关心它所引用的方法是否具有相同签名,合理的使用委托,可以提高你的代码复用 并且提升代码设计的灵活性,更多关于 委托的知识,可参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/

译文链接:https://www.infoworld.com/article/2996770/how-to-work-with-delegates-in-csharp.html

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

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

相关文章

java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件

[java 代码 import java.security.Security; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.u用到的JAR包:spring.jarmail.jaractivation.jarcommons-logging.jarlog4j-1.2.15.jarMimeMessage由发送器创建&…

java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...

本文主要向大家介绍了JAVA语言之如何判断文件,判断文件夹是否存在的代码,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。一、判断文件是否存在,不存在则创建File file new File("d:\\test.txt");if (!fil…

调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇

缘起 最近,接连在项目中遇到了两个界面无响应的问题。都只发生在客户特定机器上,不方便直接调试,只能抓取 dump 进行事后分析了。抓取 dump 远程连上可以重现问题的机器,使用 process explorer 初步观察卡死的进程,发现…

跟我一起学Redis之高可用从主从复制开始

前言现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选。但是尽快Redis性能再优秀,在当今高并发场景下,一台服务器负责读写&#xf…

【.Net core】EFCore——Code First生成数据库与表

Code First——领域设计模式中非常有用。使用 Code First 模式,专注于领域设计,创建领域类,然后生成数据库。1.创建数据模型类一般就是数据库里面有哪些表,就创建哪些模型, POCO 类就够了。public partial class SmsPu…

mysql 备份配置文件_mySQL配置文件、备份与恢复

mysql配置文件mysql的配置文件为/etc/my.cnf配置文件查找次序:若在多个配置文件中均有设定,则最后找到的最终生效/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file/PATH/TO/CONF_FILE --> ~/.my.cnfmysql常用配置文件参数&#xff…

oracle java写目录权限_oracle分配权限 学习笔记--转载

在全局数据库ORCL下创建一个用户首先在开始--》运行——》sqlplus,然后输入 sys/change_on_install as sysdba以sys权限登陆进去然后可以进行操作:创建用户 create user test indentified by test;这样就创建了一个用户名密码都为test的用户但这个时候te…

龙芯.NET正式发布 开源共享与开发者共成长

2020年12月19日,2020中国. NET开发者大会于苏州盛大开幕。本次大会以“开源、共享、创新”为主题,以线下城市苏州为中心,覆盖北京、上海、深圳、广州、长沙、成都、厦门、胶东等地区,是中国 .NET 开发者的大聚会,线上线…

划入 .NET 6版本目标,微软鼓励开发人员信任第三方库

喜欢就关注我们吧!鉴于许多 .NET 社区的开发人员都不愿意使用非微软官方打造的库,近日,微软 .NET Framework 团队的项目经理 Immo Landwerth 发布了一个名为”Growing the .NET ecosystem“的文档,以鼓励 .NET 开发人员加强对第三…

归并排序 java 迭代_经典排序算法之归并排序(示例代码)

归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为(大O符号)。1945年由约翰冯诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以…

新鲜高频笔面试题分享,Redis、MongoDB、ElasticSearch...

2020年可能是最短的一年,上班没几个月就发现要元旦了;2020年可能是最难的一年,各种降薪被离职风波;然而好消息是,2021年马上来了,跳槽季也要来了,一起开始备战吧,新年薪资up up&…

java读取整数列表_Java-检查整数列表中的X类整数

由于我没有足够的声誉来编辑我的文章,下面是我的答案gblodgett:嘿!谢谢你的回复。我正在做一个法克尔的游戏,因此我需要找出有多少1,2,3,4,5,6在列表中,然后给分(遵循规则)。我做了一个代码,似乎工作,尽管必须有一个更有效的方法来做。请随便看一看并给我一些反馈:公共int calc…

在 Windows 服务中托管 ASP.NET Core

概述众所周知,ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式,即把服务器和托管环境完全解耦。ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的Kestrel(支持跨平台),一个是基于Win…

java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例

Java 对 Properties 文件的操作详解及简单实例发布于 2020-8-7|复制链接摘记: Java 对 Properties 文件的操作简介在 Java 中,我们常用 java.util.Properties.Properties 类来解析 Properties 文件,Properties 格式文件是 Java 常用的配置文件&#xff0…

目录 | 数据结构与剑指Offer系列推文合集

【目录合集】| 作者 / Edison ZhouC#刷数据结构剑指Offer不知不觉,C#刷剑指Offer的系列推文就结束了,今天就把它们整理成目录合集。此外,考虑到剑指Offer和数据结构的关联,建议没有数据结构基础的童鞋先看看数据结构,再…

mysql数据库5120_超傻瓜 H3C S5120 限速配置

1出方向限速system-viewinterface GigabitEthernet ?/?/? (?是所要限制的端口号)qos lr outbound cir 数字 (cir是速率的意思,数字是kbps,如果按字节需要x8转换,必须是16的整数倍)出方向配置完毕2入方向限速1.system-viewacl n…

ricky java photos_【Melee】Ricky blog updates and new photos

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Blog FirstThursday, August 21, 2008Celebrate!Ok, so my computer is finally back in full swing, but sadly, Im missing a couple weeks of updates, which will be slightly complicated, racking my brain to remember, but…

Abp vNext异常处理的缺陷/改造方案

之前吐槽Abp的用户/租户管理模块!今天我又来了,这次我给Abp官方repo提了一个issue。目前Website使用Abp vNext开发,免不了要全局处理异常、提示服务器异常信息。1. Abp官方异常处理Abp项目默认会启动内置的异常处理,默认不将异常信…

java原生的编译软件_Java 转原生平台代码 RoboVM

软件介绍编者注:RoboVM 项目已经关闭,目前有开源替代产品BugVM。RoboVM 编译器可以将 Java 字节码翻译成 ARM 或者 x86 平台上的原生代码,应用可直接在 CPU 上运行,无需其他解释器或者虚拟机。RoboVM 同时包含一个 Java 到 Object…

开源项目葫芦藤:IdentityServer4的实现及其运用

前言本篇文章主要是讲解葫芦藤项目中对IdentityServer的实践使用,为了使您对本篇文章中所讲述的内容有深刻的认识,并且在阅读时避免感到乏味,文中的内容不会涉及太多的基础理论知识,而更多的是采用动手实践的方式进行讲解&#xf…