委託是.net中非常重要的特性,自.net 1.x版本就包含了,委託在專案開發過程中應用得非常多,但是一直以來很多同學對其理解得不是非常清楚(也包括我,雖然做開發很多年了,可能很多地方不知不覺也使用到了委託,但是仍然不是很清楚),那麼我會整理一個系列文章來總結和加深一下對委託的印象。
可以用兩點概括:
1,最通俗的理解是,一個安全的'函數指標'。
2,本質上,委託是一個類別(class)(可以透過IL證明如下圖),並且委託包含的是具有相同方法簽署相同傳回值的多個方法。
委託的類別圖:
從上圖我們可以得到幾點訊息,1,委託是一個類別(class)。 2,委託繼承自System.MulticastDelegate類型。
更通俗的說法是,使用委託能帶來什麼好處。
下面透過一個小的例子來示範使用委託的好處。需求是,透過輸入的name,控制台分別列印中文和英文的問候語。
不使用委託:
1 namespace DelegateDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //通过输入的name,控制台分别打印中文和英文的问候语 8 Hello("麦子", Language.Chinese); 9 Hello("mcgrady", Language.English);10 11 Console.ReadKey();12 }13 14 /// <summary>15 /// 问候16 /// </summary>17 /// <param name="name"></param>18 /// <param name="lang"></param>19 private static void Hello(string name, Language lang)20 {21 if (lang == Language.Chinese)22 {23 ChineseHello(name);24 }25 if (lang == Language.English)26 {27 EnglishHello(name);28 }29 }30 31 /// <summary>32 /// 中文问候33 /// </summary>34 /// <param name="name"></param>35 private static void ChineseHello(string name)36 {37 Console.WriteLine(string.Format("你好,{0}", name));38 }39 40 /// <summary>41 /// 英文问候42 /// </summary>43 /// <param name="name"></param>44 private static void EnglishHello(string name)45 {46 Console.WriteLine(string.Format("hello,{0}", name));47 }48 49 }50 51 /// <summary>52 /// 语言类型53 /// </summary>54 public enum Language55 {56 English,57 Chinese58 }59 }
不使用委託的時候,需要使用一個枚舉Language來表示使用中文問候還是英文問候,還要進行if...else...的判斷。
當可以直接傳遞方法的時候也許就簡單多了,下面來看一下。
使用委託:
1 namespace DelegateDemo 2 { 3 //声明委托 4 delegate void MyDel(string name); 5 6 class Program 7 { 8 static void Main(string[] args) 9 {10 //通过输入的name,控制台分别打印中文和英文的问候语11 Hello("麦子", ChineseHello);12 Hello("mcgrady", EnglishHello);13 14 Console.ReadKey();15 }16 17 /// <summary>18 /// 问候19 /// </summary>20 /// <param name="name"></param>21 /// <param name="myDel"></param>22 private static void Hello(string name, MyDel myDel)23 {24 myDel(name);25 }26 27 /// <summary>28 /// 中文问候29 /// </summary>30 /// <param name="name"></param>31 private static void ChineseHello(string name)32 {33 Console.WriteLine(string.Format("你好,{0}", name));34 }35 36 /// <summary>37 /// 英文问候38 /// </summary>39 /// <param name="name"></param>40 private static void EnglishHello(string name)41 {42 Console.WriteLine(string.Format("hello,{0}", name));43 }44 45 }46 }
所以總結起來,委託帶來的好處主要有以下幾點:
1,省去了大量的if...else...或switch... 的判斷,使得程式更物件導向了。
2,解耦,程式更容易擴充。範例:Tracy.Proxy介面代理程式元件,記錄xml日誌和效能日誌。
當然,這只是一個例子,目的是說明使用委託帶來的好處,其實還有很多地方都使用到了委託,比如winform和webform的按鈕click事件,Linq中的Func和Action委託等。
1,winform和webform的按鈕click事件。
2,Linq中的Func和Action委託。
3,Tracy.Proxy介面代理程式元件
用XMind來總結:
###
以上是什麼是委託?總結.net中重要的特性委託的詳細內容。更多資訊請關注PHP中文網其他相關文章!