zoukankan      html  css  js  c++  java
  • 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();
    }

     

  • 相关阅读:
    ES6之主要知识点(二) 变量的解构赋值。默认值
    ES6之主要知识点(一)
    前后端通信
    js 面向对象类
    typeof 、Object.prototype.toString和 instanceof
    原型链 之 对象的创建
    Ueditor1.4.3.3+springMvc+maven 实现图片上传
    Hibernate 根据实体名称得到DB表名以及表对应的Sequence name
    第三章:对象的共享——java并发编程实战
    第二章:线程安全性——java并发编程实战
  • 原文地址:https://www.cnblogs.com/tiny-home/p/4442178.html
Copyright © 2011-2022 走看看