代码改变世界

C# 中的委托和事件

2013-04-17 14:16  Evan.Pei  阅读(134)  评论(0编辑  收藏  举报

个人理解: 委托有点枚举的感觉,将方法当成参数传递,扩展时添加新方法即可,省掉多余的判断。

例子如下:

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,JimmyZhang
早上好,张子阳

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

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

将方法绑定到委托

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,JimmyZhang
早上好,JimmyZhang
早上好,张子阳

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

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