大白话讲解C# 中的委托
作者:沙奇码丶 时间:2023-02-03 02:06:41
有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调用并赋予同样的“实参”,这一天就这么过去了...
又过了几天,你又要再一次调用这么多函数了,你再老老实实地一个一个函数进行调用?!聪明的你,肯定会想:真TM麻烦!有没有一劳永逸的办法呢?
你需要的正是----“委托”
来,先看一个简单的例子,要表述的是----有一位贵宾将要作客一家豪华的酒店,老板(boss)下发了通知,他的两个助理(ass1和ass2)分别要通知到女服务员(Waiteress)和厨师(Cooker),让他们该干啥干啥去。
class Program
{
static void Main(string[] args)
{
//委托就是个“类”,也需要“实例化”,让“ass1”通知“Waiteress”。
Convey_Dele ass1 = new Convey_Dele(Waiteress);
//让“ass2”通知“Cooker”
Convey_Dele ass2 = new Convey_Dele(Cooker);
//“boss”通知两个助理“ass1和ass2”,术语为“合并委托(或“多路广播委托”)”
Convey_Dele boss = new Convey_Dele(ass1 + ass2);
//“boss”发话
boss("一位贵宾要来了!");
Console.ReadKey();
}
//声明一个叫做“Convey_Dele”的委托,形参为“string command”
public delegate void Convey_Dele(string command);
//构造一个名为“Waiteress”的函数,构造函数的形参必须与委托形参一致!
public static void Waiteress(string command)
{
//“Waiteress”要去干的事儿
Console.WriteLine("女服务员接到通知:" + command + "所以她要去迎接客人");
}
public static void Cooker(string command)
{
Console.WriteLine("厨师也接到了通知:" + command + "所以他去准备饭菜");
}
}
运行后的结果:
这样,老板发出任何指令,下级都该干啥干啥去,老板不需要知道下级的具体动作是什么,只要干的好,完成就可以。
聪明的你,又会想,代码能否再简化和多样化呢?可以。上面代码可以更改为:
class Program
{
static void Main(string[] args)
{
Convey_Dele ass1, ass2;
//另写函数再实例化太麻烦了,直接在这里把函数一起写了。术语“匿名函数”,“delegate”是关键字
ass1 = delegate (string command) { Console.WriteLine("女服务员接到通知:" + command + "所以她要去迎接客人"); };
//匿名函数也太麻烦了,还得写“delegate”,改用一个符号来表示,术语“兰姆达表达式”
ass2 = (string command) => { Console.WriteLine("厨师也接到了通知:" + command + "所以他去准备饭菜"); };
//等同于 ass1 = ass1 + ass2,基本的“加等”运算符,“减等”也是可以使用的~ 比如:若ass1 = ass1 + ass2,那ass1 -= ass1等同于ass1=ass2
ass1 += ass2;
ass1("一位贵宾要来了!");
Console.ReadKey();
}
public delegate void Convey_Dele(string command);
}
运行后的结果与之前未简化前一模一样。这样的简化写法还是有很强的“可读性”的,“匿名函数”和“兰姆达表达式”还有更简单的写法,只要是一个形参,还可以连形参都省略,知道这回事就行了...
这样,我们在调用众多函数的时候就可以灵活运用委托来简化代码和“搬砖”的繁琐劳动。
好了,初学委托的内容就先讲这么多吧,我也是在一边学习,一边去理解的,在写博客时表现出来的有许多不足之处请广大园友指出,我不吝赐教!
来源:https://www.cnblogs.com/seanyan/p/8906643.html
标签:c#,委托
0
投稿
猜你喜欢
Java基础之异常处理详解
2021-07-14 03:03:49
C#中FileStream的对比及使用方法
2023-10-17 21:09:41
详解Android Gradle插件3.0挖坑日记
2022-02-06 09:03:19
Java基础之关键字final详解
2022-01-28 00:55:31
Android-实现切换Fragment页功能的实现代码
2023-05-06 12:28:49
Java SimpleDateFormat与System类使用示例详解
2021-10-25 23:15:55
android仿微信支付宝的支付密码输入框示例
2023-09-27 22:11:47
Android APK应用安装原理解析之AndroidManifest使用PackageParser.parserPackage原理分析
2023-05-19 23:58:18
Java Arrays工具类用法详解
2023-12-19 13:08:00
简单了解springboot的jar包部署步骤
2021-07-02 14:22:48
java 并发线程个数的如何确定
2022-01-01 21:52:13
C#把dll分别放在指定的文件夹的方法步骤
2022-08-19 10:03:51
SpringBoot快速搭建实现三步骤解析
2021-06-12 22:33:24
Android布局之GridLayout网格布局
2022-04-24 22:49:46
Java关于含有继承类的成员初始化过程讲解
2022-09-24 23:25:45
详解Java目录操作与文件操作教程
2023-12-05 13:45:48
Android CheckBox中设置padding无效解决办法
2022-09-07 01:35:48
微服务如何通过feign.RequestInterceptor传递参数
2022-02-26 00:28:20
C# winfrom 模拟ftp文件管理实现代码
2023-07-15 16:29:48
Spring JPA find分页示例详解
2023-05-09 00:36:46