委托,深入淺出才是王道(一)


      委托和事件在 .NET Framework 中的應用非常廣泛,較好的理解委托和事件對很多人來說可能並不容易。它們像一道坎兒,過了這個坎兒的人,覺得真是太容易了,而沒有過去的人每次見到委托和事件就覺得心里模糊,渾身不自在。下面就通過簡潔的語言和通俗的例子來講一下什么是委托、如何實現委托,如何實現委托,以及事件的使用與處理。

View Code
 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         PepoleClass pc=new PepoleClass();
 6         pc.SpeakOperate(@"張三",PepoleClass.Language.ch);
 7         pc.SpeakOperate(@"張三",PepoleClass.Language.en);
 8         Console.ReadLine();
 9     }
10 }
11 public class PepoleClass
12 {
13     public void SpeakChinese(string name)
14     {
15         Console.WriteLine("你好,{0}", name);
16     }
17 
18     public void SpeakEnglish(string name)
19     {
20         Console.WriteLine("Hello,{0}", name);
21     }
22 
23     public enum Language
24     {
25         en, ch
26     }
27 
28     public void SpeakOperate(string name, Language lang)
29     {
30         switch (lang)
31         {
32             case Language.ch:
33                 SpeakChinese(name);
34                 break;
35             case Language.en:
36                 SpeakEnglish(name);
37                 break;
38         }
39     }
40 }

以上代碼定義一個pepole類,實現講中文和英語的方法,通過枚舉類型控制說那種語言,這樣是很好。但是細想一下,這個方法的擴展性還是太差了,如果以后我們需要再添加法語、德語,就不得不反復修改枚舉和SpeakOperate()方法以適應新的需求。

那么,有沒有更好的解決方案呢?

可能你已經想到了,我們可以使用委托。

引入委托

我們先來看看SpeakOperate()方法的聲明:

public void SpeakOperate(string name, Language lang)

可以看到,我們需要傳入兩個參數,然后根據枚舉類型判斷用哪個方法進行處理。我們假設SpeakOperate()方法可以接收一個參數變量,這個參數變量可以代表一個方法,我們只需要傳入方法名然后執行相應方法,對了,這就是委托!

      在C#中,定義委托的語法是:

delegate void SpeakDelegate(string name);

delegate關鍵字用於聲明一個引用類型,該類型可用於封裝命名方法和匿名方法。

下面用委托來改造一下這個demo,只需定義一個委托,然后更改SpeakOperate()方法即可:

public delegate void SpeakDelegate(string name);
public void SpeakOperate(string name, SpeakDelegate speak_method)
{
    speak_method(name);
}

Main函數中的調用如下:

static void Main(string[] args)
{
    PepoleClass pc = new PepoleClass();
    pc.SpeakOperate(@"張三", pc.SpeakChinese);
    pc.SpeakOperate(@"張三", pc.SpeakEnglish);
    Console.ReadLine();
}

總結:

委托是一種特殊的對象類型,它定義了方法的類型,是的可以將方法當作另一個方法的參數來進行傳遞,其特殊之處在於,我們以前定義的所有對象都包含數據,而委托包含的只是方法的地址。這種方法動態地賦值給參數的做法,可以避免在程序中大量使用if…else、switch語句,同時使得程序既有更好的擴展性。

多播委托,請聽下回分解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM