万变不离其宗:中文释义:把事情托付给别人或别的机构(办理)      回调函数:即你 别人或机构(办理)数据回传给你

干什么事情我们需要了解为何这样做

 

列如 :面向过程和面向对象         为何要重写 ,重载,这么做的目的是什么?   一切为了提高效率,代码复用对不对。

 

为何要用委托:   即观察者和订阅者关系             允许我们将方法作为参数进行传递

 

委托的三部曲:

1.定义       pubulic  delegate  void  XxxEventHandler();                        pubulic  string Xxx     and     众所周知        {} 代表方法体     而定义委托仅为一个声明或者命令 用来存储某种Xx

2.使用       XxxEventHandler      xx = new  XxxEventHandler      (被委托的方法);          哎哎哎  看到这是不是好熟悉   new关键字    new关键字不就三种用途嘛         那么委托是不是可以看作特殊的类

那么我们定义  就尽量和类平级  定义在外部

这就完了 ?     没有      

 

事件:

还是老规矩 : 事件是什么  干嘛的?

点击事件    列子:网站    我们点击注册          触发  发给后台  后台人员一看  嗯 小伙子挺精致        通过            -----------你收到了通过的信息

 

老规矩:         

pubulic  delegate  void  XxxEventHandler();     声明委托                           

public event XxxEventHandler   Xxx; 声明事件  

俩个不同的类或者窗体什么的   比如:公司和员工    

 

委托了某人今天要辞退员工       声明了XX事件    在Xx事件下有个方法触发体  一旦达到某种条件就触发

 

 

C#之基础基础在基础-------委托_值类型

 

是不是有类似       1.   公司发布人事    2. 人事通知你  3.你确定收到       

 

想一想是不是类似通信啊  俩个窗体之间 对不对      一切迎刃而解    那我们就用到了委托           在我们使用事件的时候,必须要声明对应的委托,而触发事件,其实就是在使用委托链。

 

代码如下:

C#之基础基础在基础-------委托_提高效率_02C#之基础基础在基础-------委托_多态_03
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Task
{

    public class Company
    {

        public delegate void CompanyEventHander();

        public event CompanyEventHander OnClick;

        public void issue()
        {
            //如果有人注册了这个事件,也就是这个事件不是空
            if (OnClick != null)
            {
                Console.WriteLine(" 1.公司今天需要发布新的消息 Mrs你转告他辞退她");
                OnClick();
            }
        }
    }

    public class Mrs
    {
        public delegate void MrsEventHander();
        public event MrsEventHander Onclick;
        public static void Receive()
        {
            Console.WriteLine("2.收到收到");
        }

        public void issue()
        {

            if (Onclick != null)
            {
                Console.WriteLine("3.公司让我我转告你 今天需要把你辞退!");
                Onclick();

            }


        }


      
    }

    public class Mrc
    {


        public static void Receive() { Console.WriteLine("1.好吧! 咱们有缘再聚"); }

    }
    class Program
    {


        static void Main(string[] args)
        {

            Company company = new Company();
            company.OnClick += new Company.CompanyEventHander(Mrs.Receive);
            company.issue();
        
          
            Mrs mrs = new Mrs();
            mrs.Onclick += Mrc.Receive;
            mrs.issue();


            Console.ReadKey();
        }
    }
}
View Code

 

但,微软给我们了三个内置委托         绝大部分我们用这三个足以满足需求了

 

Action<T>    Fun<T>      Predicate<int>   如何使用  看返回值     使用

 

 

1.Action<T> :无返

2.  Fun<T> :有返

3.Predicate<int> :Predicate有且只有一个参数,返回值固定为bool

 

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

  Func可以接受0个至16个传入参数,必须具有返回值

  Action可以接受0个至16个传入参数,无返回值

  Predicate只能接受一个传入参数,返回值为bool类型

 

看完写一下    就很好理解了 包括多态继承重写后面一一写

常见使用场景:窗体传值、线程启动时绑定方法、lambda表达式、异步等等。

当然       我比较菜 可能很多地方出错     麻烦大家指正  对不起了