有一天,你寫了好多好多帶“形參”的構造函數(就是“方法”,同義),而且需要向這些構造函數里傳遞同樣的“實參”,然後你就憨憨地一個一個函數的調用並賦予同樣的“實參”,這一天就這麼過去了... 又過了幾天,你又要再一次調用這麼多函數了,你再老老實實地一個一個函數進行調用?!聰明的你,肯定會想:真TM麻煩 ...
有一天,你寫了好多好多帶“形參”的構造函數(就是“方法”,同義),而且需要向這些構造函數里傳遞同樣的“實參”,然後你就憨憨地一個一個函數的調用並賦予同樣的“實參”,這一天就這麼過去了...
又過了幾天,你又要再一次調用這麼多函數了,你再老老實實地一個一個函數進行調用?!聰明的你,肯定會想:真TM麻煩!有沒有一勞永逸的辦法呢?
你需要的正是----“委托”
來,先看一個簡單的例子,要表述的是----有一位貴賓將要作客一家豪華的酒店,老闆(boss)下發了通知,他的兩個助理(ass1和ass2)分別要通知到女服務員(Waiteress)和廚師(Cooker),讓他們該幹啥幹啥去。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //委托就是個“類”,也需要“實例化”,讓“ass1”通知“Waiteress”。 6 Convey_Dele ass1 = new Convey_Dele(Waiteress); 7 8 //讓“ass2”通知“Cooker” 9 Convey_Dele ass2 = new Convey_Dele(Cooker); 10 11 //“boss”通知兩個助理“ass1和ass2”,術語為“合併委托(或“多路廣播委托”)” 12 Convey_Dele boss = new Convey_Dele(ass1 + ass2); 13 14 //“boss”發話 15 boss("一位貴賓要來了!"); 16 17 Console.ReadKey(); 18 } 19 20 //聲明一個叫做“Convey_Dele”的委托,形參為“string command” 21 public delegate void Convey_Dele(string command); 22 23 //構造一個名為“Waiteress”的函數,構造函數的形參必須與委托形參一致! 24 public static void Waiteress(string command) 25 { 26 //“Waiteress”要去乾的事兒 27 Console.WriteLine("女服務員接到通知:" + command + "所以她要去迎接客人"); 28 } 29 30 public static void Cooker(string command) 31 { 32 Console.WriteLine("廚師也接到了通知:" + command + "所以他去準備飯菜"); 33 } 34 }
運行後的結果:
這樣,老闆發出任何指令,下級都該幹啥幹啥去,老闆不需要知道下級的具體動作是什麼,只要乾的好,完成就可以。
聰明的你,又會想,代碼能否再簡化和多樣化呢?可以。上面代碼可以更改為:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Convey_Dele ass1, ass2; 6 7 //另寫函數再實例化太麻煩了,直接在這裡把函數一起寫了。術語“匿名函數”,“delegate”是關鍵字 8 ass1 = delegate (string command) { Console.WriteLine("女服務員接到通知:" + command + "所以她要去迎接客人"); }; 9 10 //匿名函數也太麻煩了,還得寫“delegate”,改用一個符號來表示,術語“蘭姆達表達式” 11 ass2 = (string command) => { Console.WriteLine("廚師也接到了通知:" + command + "所以他去準備飯菜"); }; 12 13 //等同於 ass1 = ass1 + ass2,基本的“加等”運算符,“減等”也是可以使用的~ 比如:若ass1 = ass1 + ass2,那ass1 -= ass1等同於ass1=ass2 14 ass1 += ass2; 15 16 ass1("一位貴賓要來了!"); 17 18 Console.ReadKey(); 19 } 20 21 public delegate void Convey_Dele(string command); 22 }
運行後的結果與之前未簡化前一模一樣。這樣的簡化寫法還是有很強的“可讀性”的,“匿名函數”和“蘭姆達表達式”還有更簡單的寫法,只要是一個形參,還可以連形參都省略,知道這回事就行了...
這樣,我們在調用眾多函數的時候就可以靈活運用委托來簡化代碼和“搬磚”的繁瑣勞動。
好了,初學委托的內容就先講這麼多吧,我也是在一邊學習,一邊去理解的,在寫博客時表現出來的有許多不足之處請廣大園友指出,我不吝賜教!