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

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語句,同時使得程序既有更好的擴展性。
多播委托,請聽下回分解