委托 和 事件在 .net Framework中的應用非常廣泛,然而,較好地理解委托和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委托和事件就覺得心裡憋得慌,混身不自在。本文中,我將通過兩個范例由淺入深地講述什麼是委托、為什麼要使用委托、事件的由來、.Net中的委托和事件、委托和事件對Observer設計模式的意義,對它們的中間代碼也做了討論。
將方法作為方法的參數
我們先不管這個標題如何的繞口,也不管委托究竟是個什麼東西,來看下面這兩個最簡單的方法,它們不過是在屏幕上輸出一句問候的話語:
以下是引用片段:
public void GreetPeople(string name) {
// 做某些額外的事情,比如初始化之類,此處略
EnglishGreeting(name);
}
public void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
暫且不管這兩個方法有沒有什麼實際意義。GreetPeople用於向某人問好,當我們傳遞代表某人姓名的name參數,比如說“Jimmy”,進去的時候,在這個方法中,將調用EnglishGreeting方法,再次傳遞name參數,EnglishGreeting則用於向屏幕輸出 “Morning, Jimmy”。
現在假設這個程序需要進行全球化,哎呀,不好了,我是中國人,我不明白“Morning”是什麼意思,怎麼辦呢?好吧,我們再加個中文版的問候方法:
以下是引用片段:
public void ChineseGreeting(string name){
Console.WriteLine("早上好, " + name);
}
這時候,GreetPeople也需要改一改了,不然如何判斷到底用哪個版本的Greeting問候方法合適呢?在進行這個之前,我們最好再定義一個枚舉作為判斷的依據:
以下是引用片段:
public enum Language{
English, Chinese
}
public void GreetPeople(string name, Language lang){
//做某些額外的事情,比如初始化之類,此處略
swith(lang){
case Language.English:
EnglishGreeting(name);
break;
case Language.Chinese:
ChineseGreeting(name);
break;
}
}
OK,盡管這樣解決了問題,但我不說大家也很容易想到,這個解決方案的可擴展性很差,如果日後我們需要再添加韓文版、日文版,就不得不反復修改枚舉和GreetPeople()方法,以適應新的需求。