什麼是委託?總結.net中重要的特性委託

來源:互聯網
上載者:User
  委託是.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來總結一下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.