C#开发中使用委托的作用和好处

简介: 先看概念,什么是委托?从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针”通俗的说就是:通过委托,我们可以把方法当成参数传递。这里我举个例子:“设想,如果我们写了一个厨师做菜的方法,里面有拿菜、切菜、配菜、炒菜四个步骤,但编写此方法代码的人想让配菜这个环节让调用方法的人来实现,换句话说,就是想把方法作为参数来传递,那么怎么来实现呢?方法1:使用接口,这里不是我们讨论的。

先看概念,什么是委托?

从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针”

通俗的说就是:通过委托,我们可以把方法当成参数传递。

这里我举个例子:“设想,如果我们写了一个厨师做菜的方法,里面有拿菜、切菜、配菜、炒菜四个步骤,但编写此方法代码的人想让配菜这个环节让调用方法的人来实现,换句话说,就是想把方法作为参数来传递,那么怎么来实现呢?

方法1:使用接口,这里不是我们讨论的。

方法2:使用委托、微软为我们提供了一个叫做委托的类型,委托允许我们把一个方法当成参数传递。
委托的定义

就上面的例子,拿菜、切菜、配菜、炒菜我们定义4个方法,抽象成一个做菜类(ZuoCai.cs)。

public class ZuoCai
 {
 //定义一个做菜的委托
 public delegate void ZuoCaiDelegate();
 /// 拿菜方法
 public void NaCai()
 {
 Console.WriteLine("A负责拿菜!");
 }
 /// 切菜方法
 public void QieCai()
 {
 Console.WriteLine("B负责切菜!");
 }
 /// 配菜方法
 public void PeiCai()
 {
 Console.WriteLine("C负责配菜!");
 }
 /// 炒菜方法
 public void ChaoCai()
 {
 Console.WriteLine($"D负责炒菜!");
 }
 /// 开始做菜的方法
 /// <param name="zuoCaiDelegate">委托作为参数传递</param>
 public void StartZuoCai(ZuoCaiDelegate zuoCaiDelegate)
 {
 zuoCaiDelegate();
 }
 }

委托通过关键词delegate来定义,如下:

//定义一个做菜的委托
public delegate void ZuoCaiDelegate(int number);

当然在c#4.0后,微软为我们简化了委托的定义,帮我们定义了Action和Func两种委托类型,但是原理都是通过delegate来实现,这里不跑题,有兴趣的关注我的其他章节。

定义了委托后,如何使用委托呢,委托要使用,必须实例化,如下:

//实例化一个做菜类
 ZuoCai zuoCai = new ZuoCai();
//实例化一个做菜的委托
ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai);
//把多个方法绑定到委托上。
zuoCaiDelegate += zuoCai.QieCai;
zuoCaiDelegate += zuoCai.PeiCai;
zuoCaiDelegate += zuoCai.ChaoCai;

委托可以绑定多个方法,支持+=(添加方法)和-=(取消方法),上面的定义就是将做菜的4个方法按顺序绑定在委托上,执行时候也是按顺序执行。
委托的使用

今天开店后,接了一个客户,然后店长安排做菜,如下。

public void Main()
 {
 //实例化一个做菜类
 ZuoCai zuoCai = new ZuoCai();
 //实例化一个做菜的委托
 ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai);
 zuoCaiDelegate += zuoCai.QieCai;
 zuoCaiDelegate += zuoCai.PeiCai;
 zuoCaiDelegate += zuoCai.ChaoCai;
 //开始做菜
 zuoCai.StartZuoCai(zuoCaiDelegate);
 }

运行后结果如下:

1

忽然来了一个湖南的湘妹子客户,要求配菜时候多放点辣椒,怎么办呢?

方法1:店长要求改写ZuoCai类中的PeiCai方法。

如果又来了一个广东的客户,要求放点糖,难道又要改方法吗?如果很多各种各样需求的用户,都要靠改动原有的方法来实现,这个显然不合理的,违法了设计模式中的开闭原则。

方法2:店长要求在调用地方重新添加一个配菜方法(对扩展开放),这个是合理的建议,如下:

/// 配菜方法,加辣
 void PeiCaiJiaLa()
 {
 Console.WriteLine("C负责配菜,要求多方点辣椒!");
 }

只需要把调用方的

zuoCaiDelegate += zuoCai.PeiCai;

改为

zuoCaiDelegate += PeiCaiJiaLa;

完整代码如下:

//实例化一个做菜类
 ZuoCai zuoCai = new ZuoCai();
 //实例化一个做菜的委托
 ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai);
 zuoCaiDelegate += zuoCai.QieCai;
 zuoCaiDelegate += PeiCaiJiaLa; //改为新定义的方法
 zuoCaiDelegate += zuoCai.ChaoCai;
 //开始做菜
 zuoCai.StartZuoCai(zuoCaiDelegate);

运行结果如下:

2

上面的例子很清晰的演示了方法如何作为参数传递给另外一个方法,希望对大家有帮助。

欢迎大家转发,如需要了解更多前端和后端的编程技巧,可以关注我后续的文章

相关文章
|
3天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
23 1
|
3月前
|
存储 C#
C#入门开发(Hello World,运算符)
C#入门开发(Hello World,运算符)
27 0
|
3月前
|
存储 C# C++
C#进阶-委托(Delegrate)
类似于 C 或 C++ 中函数的指针,委托是C#的函数指针,是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。本篇文章我们将讲解C#里委托的类型及如何使用。委托的语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
26 0
|
4月前
|
Java C# C++
【从Java转C#】第八章:委托、lambda、事件
【从Java转C#】第八章:委托、lambda、事件
|
4月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
40 0
|
4月前
|
SQL 关系型数据库 MySQL
C#程序设计案例开发教程
C#程序设计案例开发教程
47 0
|
4月前
|
网络协议 C# C++
BytesIO | C# 超简洁的TCP服务端开发(完整源码+视频教程)
本章将继续利用BytesIO开发TCP的服务端,简洁明了依然是主旋律,我们要在三十行代码内除了实现一个TCP服务端以外,使其支持聊天室(消息转发)、连接数限制、心跳超时检测等功能。 现在,一起跟着视频敲一敲吧!
161 0
BytesIO | C# 超简洁的TCP服务端开发(完整源码+视频教程)
|
4月前
|
存储 算法 数据处理
C# | 上位机开发新手指南(十一)压缩算法
流式压缩 流式压缩是一种能够实时处理数据流的压缩方式,例如音频、视频等实时传输的数据。 通过流式压缩算法,我们可以边读取边压缩数据,并能够随时输出已压缩的数据,以确保数据的实时性和减少存储和传输所需的带宽。 块压缩 块压缩则是将数据划分为固定大小的块,在每个块内进行独立的压缩处理。块压缩通常适用于文件、存储、传输等离线数据处理场景。 字典压缩 字典压缩是一种基于字典的压缩算法,通过建立一个字典来存储一组重复出现的字符串,并将这些字符串替换成字典中相应的索引,从而减少数据的存储和传输。字典压缩算法可以更好地处理数据中的重复模式,因为它们可以通过建立字典来存储和恢复重复出现的字符串。
44 0
C# | 上位机开发新手指南(十一)压缩算法
|
4月前
|
算法 C# 数据安全/隐私保护
C# | 上位机开发新手指南(十)加密算法——ECC
本篇文章我们将继续探讨另一种非对称加密算法——ECC。 严格的说,其实ECC并不是一种非对称加密算法,它是一种基于椭圆曲线的加密算法,广泛用于数字签名和密钥协商。 与传统的非对称加密算法(例如RSA)不同,ECC算法使用椭圆曲线上的点乘法来生成密钥对和进行加密操作,而不是使用大数分解等数学算法。这使得ECC算法具有相同的安全性和强度,但使用更少的位数,因此在资源受限的环境中具有优势。 ECC算法虽然使用公钥和私钥进行加密和解密操作,但是这些操作是基于点乘法实现的,而不是基于大数分解等算法实现的。因此,ECC算法可以被视为一种非对称加密算法的变体,但是它与传统的非对称加密算法有所不同。
130 0
C# | 上位机开发新手指南(十)加密算法——ECC