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