委托

100 阅读2分钟

委托 delegate

  namespace 委托
  {
      internal class Class委托
      {

    //定义一个乘法函数
    static double Multiply(double param1, double param2)
    {
        return param1 * param2;
    }

    //定义一个除法函数
    static double Divide(double paeam1, double param2)
    {
        return paeam1 / param2;
    }

     //定义一个名为Mydelegate的委托,委托的返回值和参数与函数一致
     delegate double MyDelegate(double param1, double param2);

    static void Main(string[] agrs)
    {
        //使用委托调用了乘法函数
        MyDelegate delegate1;
        delegate1 = Multiply;  //声明一个委托变量,首先指向Multiply
        delegate1 = Divide;    //指向发生改变  
        Console.WriteLine(delegate1(2,4));  //执行了除法函数

    }
}

函数参数和返回值为空,怎么定义委托

 //Test函数 参数列表和返回值为空 与上一个委托MyDekegate这个委托是不一致的
    static void Test()
      {
          Console.WriteLine("Test");
      }
    //要想返回Test 要定义一个与Test函数参数类型与返回值一致的委托 
    delegate void Mydelegate2(); //使用这个委托声明的变量可以指向返回值参数为空的函数
         
     static void Main(string[] agrs)
    {
        Mydelegate2 delegate3 = Test;
        delegate3(); 
    }

委托案例

 //假设两个函数是两个开发者在同时开发
 namespace 委托案例
 {
     internal class Class委托案例
      {

    delegate void OnDelegate();

    //预留出来一个委托,后期可以随意调用
    static void Play(OnDelegate onDie)  //给了一个委托类型的参数onDie 这个委托相当于一个接口
    {
        Console.WriteLine("做任务");
        Console.WriteLine("玩家正在战斗");
        Console.WriteLine("死亡");
        if (onDie != null)
        {
            onDie();
        }
        
    }

    static void ShowDieUI()
    {
        Console.WriteLine("显示游戏死亡后的UI");
        Console.WriteLine("返回首页UI");
    }

    static void Main(string[] agrs)
    {
        Play(ShowDieUI);
    }
}

delegate_委托

image.png

MathOp_数学操作 image.png

DoubleOpDelegate image.png

DoubleOpDelegate2(委托是个变量,它也可以当作一个参数去传递的) image.png

Program(委托可以指向任意一个方法(静态方法或实例方法)) image.png

当你去调用一个委托的时候,这个委托是不能为空的,否则异常报错,避免委托为空的这种异常,可以通过if来判断是否为空 image.png

Action委托

Action只能指向没有返回值(void)的方法,参数可以有多个 Func必须指向有返回值的方法 image.png

Func委托

Func必须指向有返回值的方法 Action只能指向没有返回值(void)的方法 image.png

多播委托

在整个架构里,action1既指向了Test1又指向了Test2,所以叫多播委托 image.png

异步委托

image.png 异步委托的方式启动线程 image.png