C# 委托和事件

一、委托

1. 定义

  委托是一个类,它定义了方法的类型,使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次调用所有绑定的方法。

 

2. 测试事例

  假如你需要向别人问好,在国际化社会,你可能需要用多种语言问候。

  普通的思路可以用 if 或者 swith 判断然后调用相应的代码,但是可拓展行差。

  下面介绍使用委托的办法。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Delegate
 8 {
 9     /// <summary>
10     /// 委托定义方法的签名,没有函数体
11     /// 委托可以定义在类外面
12     /// </summary>
13     /// <param name="name">姓名</param>
14     public delegate void GreetingDelegate(string name);
15 
16     class Program
17     {
18         /// <summary>
19         /// 英文问候
20         /// 注意函数签名要与委托相同
21         /// </summary>
22         /// <param name="name">姓名</param>
23         private static void EnglishGreeting(string name)
24         {
25             Console.WriteLine("Morning! " + name);
26         }
27 
28         /// <summary>
29         /// 中文问候
30         /// 注意函数签名要与委托相同
31         /// </summary>
32         /// <param name="name">姓名</param>
33         private static void ChineseGreeting(string name)
34         {
35             Console.WriteLine("早上好! " + name);
36         }
37 
38         /// <summary>
39         /// 问候
40         /// </summary>
41         /// <param name="name">姓名</param>
42         /// <param name="greeting">委托</param>
43         private static void GreetPeople(string name, GreetingDelegate greetingDelegate)
44         {
45             greetingDelegate(name);                 // 调用绑定的方法
46         }
47 
48         static void Main(string[] args)
49         {
50             GreetingDelegate greetingDelegate;
51             // 注意 第一次绑定要用 =
52             greetingDelegate = EnglishGreeting;     // 将英文问候绑定到委托
53             GreetPeople("Lin", greetingDelegate);   // 此时绑定了一个个方法
54             greetingDelegate += ChineseGreeting;    // 再将中文问候绑定到委托
55             GreetPeople("Lin", greetingDelegate);   // 此时绑定了两个方法
56             greetingDelegate -= EnglishGreeting;    // 将英文问候从委托中移除
57             GreetPeople("Lin", greetingDelegate);   // 此时绑定了一个个方法
58 
59             Console.ReadKey();
60         }
61     }
62 }

 

 3. 运行截图

 

 

 

 

二、事件

1. 委托和事件的区别

  委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一。

 

2. 测试事例

  我们还是使用上述委托所用的事例,那么使用事件的代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Event
 8 {
 9     /// <summary>
10     /// 委托定义方法的签名,没有函数体
11     /// 委托可以定义在类外面
12     /// </summary>
13     /// <param name="name">姓名</param>
14     public delegate void GreetingDelegate(string name);
15     
16     /// <summary>
17     /// 问候管理类
18     /// </summary>
19     public class GreetingManage
20     {
21         public event GreetingDelegate makeGreet;       // 声明事件
22 
23         public void GreetPeople(string name)            // 问候
24         {
25             if (makeGreet != null)
26             {
27                 makeGreet(name);
28             }
29         }
30     }
31 
32     class Program
33     {
34         /// <summary>
35         /// 英文问候
36         /// 注意函数签名要与委托相同
37         /// </summary>
38         /// <param name="name">姓名</param>
39         private static void EnglishGreeting(string name)
40         {
41             Console.WriteLine("Morning! " + name);
42         }
43 
44         /// <summary>
45         /// 中文问候
46         /// 注意函数签名要与委托相同
47         /// </summary>
48         /// <param name="name">姓名</param>
49         private static void ChineseGreeting(string name)
50         {
51             Console.WriteLine("早上好! " + name);
52         }
53 
54         static void Main(string[] args)
55         {
56             GreetingManage gm = new GreetingManage();
57             //gm.makeGreet = EnglishGreeting;       // 报错,不能用 = 赋值
58             gm.makeGreet += EnglishGreeting;        // 添加绑定方法
59             gm.makeGreet += ChineseGreeting;
60             gm.GreetPeople("Lin");                  // 此时绑定了两个方法
61             gm.makeGreet -= EnglishGreeting;        // 去除绑定
62             gm.GreetPeople("Lin");                  // 此时绑定了一个方法
63 
64             Console.ReadKey();
65         }
66     }
67 }

 

3. 运行截图

 

 

posted @ 2018-04-03 10:37  Just_for_Myself  阅读(823)  评论(0编辑  收藏  举报