大白话讲解C# 中的委托
作者:沙奇码丶 发布时间:2023-02-03 02:06:41
标签:c#,委托
有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调用并赋予同样的“实参”,这一天就这么过去了...
又过了几天,你又要再一次调用这么多函数了,你再老老实实地一个一个函数进行调用?!聪明的你,肯定会想:真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
0
投稿
猜你喜欢
- public class MD5Check {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的
- 1 StringString:字符串常量,字符串长度不可变。2 StringBufferStringBuffer:字符串变量(Synchro
- 微服务feign调用添加token1.一般情况是这么配置的具体的怎么调用就不说了 如下配置,就可以在请求头中添加需要的请求头信息。packa
- Java 方法执行时的动态分派和静态分派是 Java 实现多态的本质背景Java 的动态分派和静态分派也是 Java 方法的执行原理。 Ja
- 本文实例讲述了Java实现批量向mysql写入数据的方法。分享给大家供大家参考,具体如下:private static String use
- 目录Set接口概述HashSet实现类1、HashSet 具有以下特点:2、HashSet 集合判断两个元素相等的标准3、向HashSet中
- 开发中经常遇到从集合类List、Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.Null
- ThreadLocal是什么ThreadLocal是线程Thread中属性threadLocals即ThreadLocal.ThreadLo
- 在Android中因为不同像素手机的多样化,对于一张图片,放大不同的手机上因像素不同显示上也会有区别。现有如下需求:将一张图片宽度充满整个屏
- AOP拦截Controller获取@PathVariable注解传入参数前言:最近项目中需要对controller传入的应用标识(appMa
- 1.简介本教程将介绍如何在Spring Security中设置身份验证提供程序,与使用简单UserDetailsService的标准方案相比
- 代码如下import java.util.concurrent.Callable;import java.util.concurrent.E
- intellij idea是一款非常优秀的软件开发工具,它拥有这强大的插件体系,可以帮助开发者完成很多重量级的功能。今天,我们来学习一下如何
- 本文为大家分享了使用静态关键字实现单例模式的具体代码,供大家参考,具体内容如下单例模式:只能获得某个类的唯一一个实例单例模式,不管什么时间点
- 本文实例讲述了Java * 和AOP应用。分享给大家供大家参考,具体如下:一 点睛 * 在AOP(Aspect Orient Progr
- 接收到这样一个需求,就是英文名字中firstName和lastName,其中任何一个为null,就返回Empty。刚拿到需求,这不简单,if
- 1、来源random.nextInt() 为 java.util.Random类中的方法; Math.random() 为 java.lan
- Java多线程综合案例数字加减设计4个线程对象,两个线程执行减操作,两个线程执行加操作public class ThreadDemo{ &n
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 这篇文章主要介绍了java加载property文件配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,