一、委托 1. 定義 委托是一個類,它定義了方法的類型,使用委托可以將多個方法綁定到同一個委托變數,當調用此變數時,可以依次調用所有綁定的方法。 2. 測試事例 假如你需要向別人問好,在國際化社會,你可能需要用多種語言問候。 普通的思路可以用 if 或者 swith 判斷然後調用相應的代碼,但是可拓 ...
一、委托
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. 運行截圖