• 委托的使用


     

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Delegate {
         //定义委托,它定义了可以代表的方法的类型
         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);
               }

               //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
               private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
                   MakeGreeting(name);
                }

               static void Main(string[] args) {
                   GreetPeople("Jimmy Zhang", EnglishGreeting);
                   GreetPeople("张子阳", ChineseGreeting);
                   Console.ReadKey();
               }
            }
        }

    输出如下:
    Morning, Jimmy Zhang
    早上好, 张子阳

    我们现在对委托做一个总结:

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

     

    =========================

    1 委托GreetingDelegate 和 类型 string 的地位一样,都是定义了一种参数类型

    static void Main(string[] args) {
        GreetingDelegate delegate1, delegate2;
        delegate1 = EnglishGreeting;
        delegate2 = ChineseGreeting;

        GreetPeople("Jimmy Zhang", delegate1);
            GreetPeople("张子阳", delegate2);
            Console.ReadKey();
    }

    2 委托不同于string的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法

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

         // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        GreetPeople("Jimmy Zhang", delegate1); 
        Console.ReadKey();
    }

    输出为:
    Morning, Jimmy Zhang
    早上好, Jimmy Zhang

     

     

    3  实际上,我们可以也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:

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

        // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        delegate1 ("Jimmy Zhang");  
        Console.ReadKey();
    }

     

    4

    注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。

    我们也可以使用下面的代码来这样简化这一过程:

    GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
    delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

    看到这里,应该注意到,这段代码第一条语句与实例化一个类是何其的相似,你不禁想到:上面第一次绑定委托时不可以使用“+=”的编译错误,或许可以用这样的方法来避免:

    GreetingDelegate delegate1 = new GreetingDelegate();
    delegate1 += EnglishGreeting;   // 这次用的是 “+=”,绑定语法。
    delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

     

    5   既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:

    static void Main(string[] args) {
        GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
        delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

        // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
        GreetPeople("Jimmy Zhang", delegate1); 
        Console.WriteLine();

        delegate1 -= EnglishGreeting; //取消对EnglishGreeting方法的绑定
        // 将仅调用 ChineseGreeting
        GreetPeople("张子阳", delegate1);
        Console.ReadKey();
    }
    输出为:
    Morning, Jimmy Zhang
    早上好, Jimmy Zhang
    早上好, 张子阳

    让我们再次对委托作个总结:

    使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

    //==========================

    public delegate void GreetingPeople(string name);
    public class delegateDemo
    {
       
     public delegateDemo()
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }
        public static void ChineseG(string name)
        {
            Console.WriteLine("你好'", name);
        }
        public static void EnglistG(String name)
        {
            Console.WriteLine("HELL,", name);
        }
        public static void GR(string name, GreetingPeople GRing)
        {
            GRing(name);
        }
        static void GG(string [] agr)
        {
            GR("hello,", EnglistG);
            GR("你好,:", ChineseG);
        }

    }

    ==

  • 相关阅读:
    SourceInsight宏插件3(非常好用,强力推荐)
    SourceInsight宏插件2(非常好用,强力推荐)
    Beyond Compare 3添加右键菜单
    OpenCV图像读取和写入
    TY科技的工程配置(VS2017 & Opencv4.0.0)
    Visual Studio2017 & pcl1.8.1 库的配置
    LeetCode No.198
    LeetCode No.191
    LeetCode No.190
    LeetCode No.179**
  • 原文地址:https://www.cnblogs.com/csj007523/p/1249666.html
Copyright © 2020-2023  润新知