• The fifth assigiment


    这周我们又看到了一个似曾相识但却不熟悉的东西..delegates中文名委托(其实和C++中的函数指针差不多...不过之前并没有用过函数指针

    委托..其核心就是

    将方法作为方法的参数

    先看一段代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1
    {
      public delegate void GreetingDelegate(string name);
      class Program
      {

        private static void EnglishGreeting(string name)
        {
          Console.WriteLine("Morning, " + name);
        }  

        private static void ChineseGreeting(string name)
        {
          Console.WriteLine("早上好, " + name);
        }

        private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
          MakeGreeting(name);
        }

        static void Main(string[] args)
        {
          GreetPeople("David", EnglishGreeting);
          GreetPeople("大卫", ChineseGreeting);
        }
      }
    }

      委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    我们可以将函数作为一个数据类型

    就像这样

    static void Main(string[] args) {
        GreetingDelegate delegate1, delegate2;
        delegate1 = EnglishGreeting;
        delegate2 = ChineseGreeting;
    
        GreetPeople("David", delegate1);
        GreetPeople("大卫", delegate2);
    }

    同时我们还可以将多个函数绑定到同一个委托上..

    static void Main(string[] args) {
        GreetingDelegate delegate1;
        delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
        delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法
    
         // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        GreetPeople("David", delegate1);  
    }

    还有,我们可以也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:

    static void Main(string[] args) {
        GreetingDelegate delegate1;
        delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
        delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法
    
        // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        delegate1 ("Jimmy Zhang");   
    }

    结果和上面是一样的.

    PS:在使用绑定的时候,绑定第一个方法要用'=',绑定之后的方法用"+=".....

    同时,不光有绑定,还有解绑:

    static void Main(string[] args) {
        GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
        delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法
    
        // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        GreetPeople("David", delegate1);  
        Console.WriteLine();
    
        delegate1 -= EnglishGreeting; //取消对EnglishGreeting方法的绑定
        // 将仅调用 ChineseGreeting 
        GreetPeople("大卫", delegate1); 
        Console.ReadKey();
    }

     

  • 相关阅读:
    ubuntu16.04安装ibus中文输入法
    apt --fix-broken install
    fuelgauge
    make flash FLASH_CONFIG=jtag_full
    使用android ndk编译boost动态库
    RK3288的gpio设置
    RK3288 GPIO 输出问题
    HDU-2586-裸LCA入门-tarjan离线
    uva-11324-SCC+dp
    HDU-2767-tarjan/Kosaraju求scc
  • 原文地址:https://www.cnblogs.com/tiny-home/p/4442178.html
Copyright © 2020-2023  润新知