关于C#中委托的思考与实例

news/2024/10/18 18:28:15/

委托的定义:委托是持有一个或多个方法的对象。

delegate void MyDel(int value);//声明委托类型
MyDel del;//声明委托变量

委托的实质:委托的实质其实也是类,同样继承System.Object,这也是委托无论在类内还是类外都能被定义的原因。

委托的作用:委托是一种类型安全的函数回调机制,它不仅能够调用实例方法,也能调用静态方法,并且具备执行多个方法的能力。

委托的本质:委托的本质就是将可执行的代码从一个方法传递到另一个方法;从程序的角度上来看,你可以把委托看成是用来执行方法的一个“指针”。

委托存在的意义:一般情况下你不会想要“执行”一个对象,但委托会执行它所“持有”的方法。
1、使用委托可以增强可扩展性。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用 If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

不使用委托的情况

  class Program{//委托的意义之一:使程序具有更好的可扩展性//将方法当做参数一样使用,避免了对方法的判断,极大强化的程序的可扩展性static void Main(string[] args){GreetPeople("jakecheng", Language.English);GreetPeople("成龙", Language.Chinese);Console.ReadLine();}public enum Language { English,Chinese}public static void GreetPeople(string name,Language lang){switch (lang){case Language.English:GreetEnglishPeople(name);break;case Language.Chinese:GreetChinesePeople(name);break;     }}public static void GreetChinesePeople(string name){Console.WriteLine("早上好,"+name);}public static void GreetEnglishPeople(string name){Console.WriteLine("Morning," + name);}}

使用委托的情况

  delegate void GreetingDelegate(string name);class Program{static void Main(string[] args){GreetPeople("Jake cheng", new GreetingDelegate(GreetEnglishPeople));//MyDelegate(GreetEnglishPeople)GreetPeople("成龙", GreetChinesePeople);Console.ReadLine();}public static void GreetPeople(string name, GreetingDelegate MyDelegate){MyDelegate(name);}public static void GreetChinesePeople(string name){Console.WriteLine("早上好," + name);}public static void GreetEnglishPeople(string name){Console.WriteLine("Morning," + name);}}

在使用委托的情况下,代码的冗余明显下降。
委托的使用流程
1、声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块

2、使用该委托类型声明一个委托变量

3、创建一个委托类型的对象,并把它赋值给委托变量。新的委托对象包含指向某个方法的一用,这个方法的签名和返回类型必须跟第一步中定义的委托类型一致。

4、你可以选择为委托对象添加其他方法

5、在代码中你可以像调用方法一样调用委托


http://www.ppmy.cn/news/58045.html

相关文章

【计算几何】判断一条线段和一段圆弧是否相交 C++代码实现

文章目录 一、前言二、线段与圆弧的代码表示2.1 线段代码表示2.2 圆弧代码表示 三、实现思路及数学推导3.1 第一步(粗略判断)3.2 第二步3.3 第三步 四、完整代码五、效果展示 一、前言 最近做项目,需要判断一条线段是否和一段圆弧相交&#…

MySQL库和表

MySQL库操作 创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明: 大写的表示关键字[ ]是可选项CHARACTER…

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自远程穿透文章:Windows通过RDP异地远程桌面Ubuntu【内网穿透】 前言 XRDP是一种开源工具,它允许用户通过Windows…

linux下安装mysql-8.0.30超级详细

一、下载方式一: MySQL :: Download MySQL Community Server 或者到我的百度网盘中下载---- 链接:https://pan.baidu.com/s/1hZvfZw4S4TqF7XOFu_2ekg?pwdziuu 提取码:ziuu --来自百度网盘超级会员V6的分享 下载方式2---或者使用 -- wget 命令下…

Android9.0 系统Framework发送通知流程分析

1.前言 在android 9.0的系统rom定制化开发中,在systemui中一个重要的内容就是系统通知的展示,在状态栏展示系统发送通知的图标,而在 系统下拉通知栏中展示接收到的系统发送过来的通知,所以说对系统framework中发送通知的流程分析很重要,接下来就来分析下系统 通知从frame…

黑客如何在攻击中使用生成式人工智能以及我们能做些什么?

生成式人工智能 (AI) 最近备受关注。AI 驱动的聊天机器人 ChatGPT 和 VALL-E 等其他支持自然语言处理的系统已将生成 AI 带给了公众,并释放了它的好处和坏处。 关于生成式 AI 的核心担忧之一是它可用于升级恶意攻击并提出更复杂的网络攻击。 那么,黑客…

Ae:画笔工具

画笔工具 Brush Tool 快捷键:Ctrl B 画笔工具 Brush Tool仅能工作在图层 Layer面板上。 双击纯色图层、像素图层等可打开图层面板。 在 Ae 中的每次画笔绘制都将新建一条路径,然后通过对路径的描边来显示绘制结果,故又称为“绘画描边”或“…

4.30学习周报

文章目录 前言文献阅读摘要简介数据源和预处理理论基础与模型构建结果和讨论结论和未来工作 时间序列预测总结 前言 本周阅读文献《Water Quality Prediction Based on LSTM and Attention Mechanism: A Case Study of the Burnett River, Australia》,文献主要提出…