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. 运行截图