服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 大白话讲解C# 中的委托

大白话讲解C# 中的委托

2022-10-19 12:54沙奇码丶 C#

这篇文章主要介绍了C# 中的委托的相关资料,帮助初学者更好的理解和使用c#,感兴趣的朋友可以了解下

有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调用并赋予同样的“实参”,这一天就这么过去了...

又过了几天,你又要再一次调用这么多函数了,你再老老实实地一个一个函数进行调用?!聪明的你,肯定会想:真TM麻烦!有没有一劳永逸的办法呢?

你需要的正是----“委托”

来,先看一个简单的例子,要表述的是----有一位贵宾将要作客一家豪华的酒店,老板(boss)下发了通知,他的两个助理(ass1和ass2)分别要通知到女服务员(Waiteress)和厨师(Cooker),让他们该干啥干啥去。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 + "所以他去准备饭菜");
    }
  }

运行后的结果:

大白话讲解C# 中的委托

这样,老板发出任何指令,下级都该干啥干啥去,老板不需要知道下级的具体动作是什么,只要干的好,完成就可以。

聪明的你,又会想,代码能否再简化和多样化呢?可以。上面代码可以更改为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
  }

 运行后的结果与之前未简化前一模一样。这样的简化写法还是有很强的“可读性”的,“匿名函数”和“兰姆达表达式”还有更简单的写法,只要是一个形参,还可以连形参都省略,知道这回事就行了...

 这样,我们在调用众多函数的时候就可以灵活运用委托来简化代码和“搬砖”的繁琐劳动。

好了,初学委托的内容就先讲这么多吧,我也是在一边学习,一边去理解的,在写博客时表现出来的有许多不足之处请广大园友指出,我不吝赐教!

以上就是大白话讲解C# 中的委托的详细内容,更多关于c# 委托的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/seanyan/p/8906643.html

延伸 · 阅读

精彩推荐
  • C#C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    这篇文章主要介绍了C#使用Protocol Buffer(ProtoBuf)进行Unity的Socket通信的实例,Protocol Buffer是Google开发的数据格式,也是除了XML和JSON之外人气第三高的^^需要的朋友...

    灵犀的博客10312021-11-19
  • C#C#向线程中传递多个参数的解决方法(两种)

    C#向线程中传递多个参数的解决方法(两种)

    这篇文章主要介绍了C#向线程中传递多个参数的解决方法(两种)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    C#教程网10272021-12-02
  • C#几分钟搞懂c#之FileStream对象读写大文件(推荐)

    几分钟搞懂c#之FileStream对象读写大文件(推荐)

    这篇文章主要介绍了c#之FileStream对象读写大文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    牛掰是怎么形成的7782022-07-21
  • C#如何使用C#从word文档中提取图片

    如何使用C#从word文档中提取图片

    图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今...

    C#教程网11752021-11-12
  • C#C# 获取系统字体的示例代码

    C# 获取系统字体的示例代码

    这篇文章主要介绍了C# 获取系统字体的方法,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    唐宋元明清218810162022-09-26
  • C#输出的文本实现对齐的方法(超简单)

    输出的文本实现对齐的方法(超简单)

    下面小编就为大家分享一篇c#输出的文本实现对齐的方法,特别简单!希望对大家有所帮助。一起跟随小编过来看看吧...

    杨明波(Leo Yang)10982022-02-15
  • C#C#验证码问题的快速解决方法

    C#验证码问题的快速解决方法

    下面小编就为大家带来一篇C#验证码问题的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网10592021-12-01
  • C#.NET的深复制方法(以C#语言为例)

    .NET的深复制方法(以C#语言为例)

    深复制需要将对象实例中字段引用的对象也进行复制,在平时的编程工作中经常要用到这种复制方式,下面以c#为例来演示一下方法。...

    北风其凉8862021-12-08