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

     

  • 相关阅读:
    ASP.NET 2.0 X64 引起的问题
    .net 俱乐部7月份资料下载 .net 开源项目
    用schemaSpy制作数据库文档
    IbatisNet支持2.0的版本Release 发布了
    Introduction to Model Driven Development with AndroMDA
    开放源代码与.NET应用程序平台的性能测试
    sqlserver 2000/2005 Ambiguous column error错误解决办法
    ASP.NET 2.0 中 Web 事件
    使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
    Working with Windows Workflow Foundation in ASP.NET
  • 原文地址:https://www.cnblogs.com/tiny-home/p/4442178.html
Copyright © 2011-2022 走看看