上一章中我們可能會很疑惑,為什么需要委托?為什么不直接在MyMethod方法里直接調用Add方法,反而要實例化一個委托對象來完成調用呢?這豈不是自找麻煩嗎?
當然,c#引入委托並不是自找麻煩。委托是c#最好的一個特性,它為后來的很多特性都打下了基礎。委托使得一個方法可以作為另一個方法的參數進行傳遞,這就是委托最大的作用。如下例子:
例如我們要實現一個打招呼的方法,而每個國家打招呼的方式都不一樣,剛開始我們可能會像下面這樣實現打招呼的方法:
public void Greeting(string name,string language) { switch (language) { case "zh-cn": ChineseGreeting(name); break; case "en-us": EnglishGreeting(name); break; default: EnglishGreeting(name); break; } } public void EnglishGreeting(string name ) { Console.WriteLine("Hello, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("你好, " + name); }
若后續我們需要添加德國、日本等打招呼方法,就必須修改Greeting方法內的case語句,來適應新的需求,這樣特別不方便。有了委托,我們就可以把函數作為參數,並像如下代碼實現Greeting方法:
public delegate void GreetingDelegate(string name); static void Main(string[] args) { //引入委托 Program p = new Program(); p.Greeting("小葉", p.ChineseGreeting); p.Greeting("Tommy Li", p.EnglishGreeting); Console.Read(); } public void Greeting(string name,GreetingDelegate callback) { callback(name); } public void EnglishGreeting(string name) { Console.WriteLine("Hello, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("你好, " + name); }
如下,增加德國人打招呼:
class Program { public delegate void GreetingDelegate(string name); static void Main(string[] args) { //引入委托 Program p = new Program(); p.Greeting("小葉", p.ChineseGreeting); p.Greeting("Tommy Li", p.EnglishGreeting); p.Greeting("Ha Wa", p.GermanyGreeting); Console.Read(); } public void Greeting(string name,GreetingDelegate callback) { callback(name); } public void EnglishGreeting(string name) { Console.WriteLine("Hello, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("你好, " + name); } public void GermanyGreeting(string name) { Console.WriteLine("Hallo, " + name); } }