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();
}

 

原文地址:https://www.cnblogs.com/tiny-home/p/4442178.html