將方法作為方法的參數 —— 理解托付
《.NET開發之美》上對於托付寫到:“它們就像是一道檻兒,過了這個檻的人,認為真是太easy了,而沒有過去的人每次見到托付和事件就認為心裏別得慌,混身不自在。”我認為這句話就像是在說我自己一樣。於是我決定好好看看關於這方面的知識。
一、托付與接口
事實上非常多時候我感覺托付所起的作用與定義一個僅僅是含有一個方法的接口全然一樣的。他們實現的功能是同樣的。
如果有這樣一個樣例:
事實上這個樣例非常easy,就是定義了一個IGreeting接口,裏面有一個Greetingpeople方法,EnglishGreeting和ChineseGreeting都是通過實現這個接口來顯示的。
假設通過托付應該怎麽樣實現呢?
二、將方法作為方法的參數
剛才的功能假設正常我們會選擇下面方法來實現:
public void GreetPeople(string name, Language lang) { //做某些額外的事情,比方初始化之類。此處略 switch (lang) { case Language.English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } public enum Language//enum為枚舉函數 { English, Chinese } static void Main(string[] args) { GreetPeople("Jimmy Zhang", Language .English ); Console.ReadKey(); }
可是這個方案須要我們重復改動枚舉和GreetPeople()方法。以適應新的需求。
假設你再細致想想,假如GreetPeople()方法能夠接受一個參數變量。這個變量能夠代表還有一個方法,當我們給這個變量賦值 EnglishGreeting的時候,它代表著 EnglsihGreeting() 這種方法;當我們給它賦值ChineseGreeting 的時候,它又代表著ChineseGreeting()方法。我們將這個參數變量命名為 MakeGreeting。那麽不是能夠如同給name賦值時一樣,在調用 GreetPeople()方法的時候,給這個MakeGreeting 參數也賦上值麽(ChineseGreeting或者EnglsihGreeting等)?然後,我們在方法體內。也能夠像使用別的參數一樣使用 MakeGreeting。
可是。因為MakeGreeting代表著一個方法。它的使用方式應該和它被賦的方法(比方ChineseGreeting) 是一樣的,比方:MakeGreeting(name)。
依照上面的思路,
Public void EnglishGreeting(string name)
public void ChineseGreeting(string name)
string 定義了name參數所能代表的值的種類。也就是name參數的類型。
於是,托付出現了:它定義了MakeGreeting參數所能代表的方法的種類,也就是MakeGreeting參數的類型。
於是。從圖中能夠看出,生命了GreetingDelegate: public delegate void GreetingDelegate(string name)。而且,在greetpeople 方法中。MakeGreeting方法作為參數與name地位是一樣的。代碼例如以下:
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); }
同理,而既然托付GreetingDelegate 和 類型 string 的地位一樣,都是定義了一種參數類型。那麽。我是不是也能夠這麽使用托付?
static void Main(string[] args) { GreetingDelegate delegate1, delegate2; delegate1 = EnglishGreeting; delegate2 = ChineseGreeting; GreetPeople("Jimmy Zhang", delegate1); GreetPeople("張子陽", delegate2); Console.ReadKey();
將方法作為方法的參數 —— 理解托付