大白话讲解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);
  }

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

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

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

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

(0)

相关推荐

  • 关于C#委托三种调用的分享使用

    一.同步调用 1.同步调用会按照代码顺序来执行 2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threadi

  • C# WPF 通过委托实现多窗口间的传值的方法

    在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值. 在上代码之前呢,先简单介绍一下什么是C#中的委托(如果只想了解如何传值可以略过这部分)在网络上有很多对于委托的介绍和讲解,经过我的学习和总结加上了一点我自己的理解,我认为委托是一种类似于C语言的指针,但是它指向的是方法而不是变量.如果把委托看作一个变量,那么这个变量里存着的就是你目标方法的地址,调用委托约等于调用你的目标方法.(个人理解欢迎指正交流) 以下正文:

  • C#用委托BeginInvoke做异步线程

    一个应用场景,浏览器上传一个文件,此文件后台调用文件转换,需要耗费相当长的时间,这样,如果是一个线程同步式的做下去,那么用户在浏览器上感觉就是卡住了,卡卡卡卡,这里我们利用委托的BeginInvoke和EndInvoke方法操作线程,BeginInvoke方法可以使用线程异步地执行委托所指向的方法.然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用,说白了就是相当于开个多线程,你用户文件保存了之后,响应返回,这个Be

  • C#线程委托实现原理及方法解析

    很多时候写windows程序都需要结合多线程,在C#中用如下得代码来创建并启动一个新的线程. Thread thread = new Thread(new ThreadStart(ThreadProc));//实例化一个线程 thread.IsBackground = true;//将线程改为后台线程 thread.Start();//开启线程 但是很多时候,在新的线程中,我们需要与UI(Windows窗体设计器用户界面)进行交互,在C#中不允许直接这样做.可以参考MSDN中的描述. "Wind

  • C# 引入委托的目的是什么

    引言: 对于一些刚接触C# 不久的朋友可能会对C#中一些基本特性理解的不是很深,然而这些知识也是面试时面试官经常会问到的问题,所以我觉得有必要和一些接触C#不久的朋友分享下关于C#基础知识的文章,所以有了这个系列,希望通过这个系列让朋友对C#的基础知识理解能够更进一步.然而委托又是C#基础知识中比较重要的一点,基本上后面的特性都和委托有点关系,所以这里就和大家先说说委托,为什么我们需要委托. 一.C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子--生活中,如果如果我们需要打官司

  • 详解C#之委托

    委托:顾名思义,让别人帮你办件事.委托是C#实现回调函数的一种机制.可能有人会问了,回调函数是个啥??? 举个例子:我现在是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉这个小姐姐,一旦收到新的简历就转发给我一份. 这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用.一旦有了满足条件(收到了新的简历),小姐姐就会转发给我(触发回调函数) 用来代码来看看是怎么实现的: 1.定义一个委托: // 定义委托,这

  • c# 委托的本质是什么

    引言 上一个专题已经和大家分享了我理解的--C#中为什么需要委托,专题中简单介绍了下委托是什么以及委托简单的应用的,在这个专题中将对委托做进一步的介绍的,本专题主要对委本质和委托链进行讨论. 一.委托的本质 平时我们很容易使用委托--用C# delegate关键字定义委托,再用new操作符构造委托实例,然后通过调用委托实例来调用回调方法(就是用一个了委托对象的变量来代替方法名,这句话如果刚接触的人不好理解的话,这里给个例子:MyDelegate mydelegate =new Mydelegat

  • 一篇文章彻底搞清楚c#中的委托与事件

    一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:"委托和事件有何异同?".如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委托也不例外.那么先来看c#中的委托定义,先来个例子: public delegate void GetPacage(string code); 这个委托,看起来就是个方法签名,取包裹,需要验证码.与方法签名不同的地方,在于多了一个delegate.c#中不乏一些便利好用的语法,比如fore

  • c# 委托的常见用法

    此篇文章是我一个小白对委托的理解和总结,请高手多多评判指教. 委托就是一种后期绑定机制,说的直白点就是在调用的时候才去传递业务逻辑的一种算法. 委托的创建语法: public delegate int Comparison<in T>(T left, T right);//官方给出的定义泛型委托的demo 语法看似像声明一个变量或方法的签名,但实现上是在声明一个类型.编译器会生成一个派生自System.MulticastDelegate的类(而System.MulticastDelegate派

  • c#基础知识---委托,匿名函数,lambda

    前言: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托(Delegate)特别用于实现事件和回调方法.所有的委托都派生自 System.Delegate 类.把一个方法当作参数传递,让其它方法进行调用执行. 1.委托的声明 委托声明决定了可由该委托引用的方法.委托可指向一个与其具有相同标签的方法. 1.1.delegate 1.1.1. 0-23个参数,可以有返回值也可以没有返回值 public d

随机推荐