初入社會,對於我這個初級程序員來講要學的東西實在太多了,公司最近在作一個winform框架開發的桌面應用程序,衆所周知,winform也好,webform也好,裏面隨處可見的事件驅動,有事件,固然也少不了委託,感受以前對委託這個概念的理解一直是模模糊糊的,口裏都會背的那麼幾句話:「委託能夠把方法看成參數在另外一個方法中傳遞和調用」,「委託是方法的快捷方式」等等。可是真要深刻理解,靈活運用,仍是要有良好的代碼理解功底和麪向對象基礎的,今天就再來把委託這個知識梳理梳理,以加深對它的理解。程序員
要理解委託,咱們首先要知道委託的概念:web
」委託是一個類,它定義了方法的類型,使得能夠將方法看成另外一個方法的參數來進行傳遞,這種將方法動態地賦給參數的作法,能夠避免在程序中大量使用If-Else(Switch)語句,同時使得程序具備更好的可擴展性。「編程
這是百度上和許多教科書上都有的一個概念,可是初學這門編程語言的話,或者基礎比較差的童鞋,看到這句話,確定是一臉懵比,先不用着急,咱們來慢慢經過代碼去理解委託這個概念框架
(1)首先新建一個控制檯程序,對於初學者而言,控制檯程序是學習基礎知識的最好工具編程語言
//delegate void EvenHandler(object sender, EventArgs e); public delegate void MyDel();//自定義一個委託 class Program { static void Main(string[] args) { //(1)簡單委託 MyDel say1 = SayHi; MyDel say2 = new MyDel(SayHi); say1(); say2(); } static void SayHi() { Console.WriteLine("Hi World"); } }
這是最簡單的委託實例了,委託能夠經過上面say1和say2兩種方式進行調用,這裏咱們要知道委託也是一種類型,因此它和類是同級的,能夠經過委託來掉用方法,不要誤覺得委託和方法同級的,方法只是類的成員,還有定義委託和與之對應的方法必須具備相同的方法簽名,即參數個數,類型相同,返回值類型相同,上面代碼實例沒有什麼實際意義,只是然咱們知道委託的結構以及委託與方法的關係ide
(2)委託的擴展工具
//自定義一個委託 public delegate int Expression(int a, int b); class Program { static void Main(string[] args) { //(2)委託擴展 //Expression ex = GetEX; //Calculate(ex, 25, 10); Calculate(GetAdd, 25, 10); } static int Add(int a, int b) { return a + b; } static int Divide(int a, int b) { return a / b; } static int subtract(int a, int b) { return a - b; } static int multiply(int a, int b) { return a * b; } static int GetAdd(int a, int b) { return a + b; } static void Calculate(Expression ex, int a, int b) { Console.WriteLine(ex(a, b) + "\n"); } }
和以前比,稍微把代碼複雜了那麼一點點,上面咱們真正實現了「把方法看成參數在另外一個方法中傳遞或調用」,實現了一個簡單的加法方法,固然咱們也寫了減法,乘法,除法的方法。你會想這樣寫有什麼好處呢?我直接調用本身的加減乘除方法不就完了嗎,何須要畫蛇添足,經過委託來折騰一番呢?委託的意義何在呢?在這裏請先聽我先說一種思想:「上面的Calculate方法裏面代碼比較少,只有一個簡單的輸出語句,並且咱們只想單純的實現一個簡單加減乘除效果,因此你會感受有點屢次一舉,也能夠說原本就是屢次一舉,可是你能夠設想一下,假如咱們這幾個加減乘除方法,它的代碼量很是龐大,可是這幾個方法的代碼類似度又很是高,可是每一個方法裏就只有一兩個小小的語句塊兒不同,那不是會讓你以爲很不爽,很想把它們整合,那怎麼處理呢?你可能首先會想經過if,else if或者switch語句對不一樣部分的代碼塊作不一樣的處理,如今我只須要作加減乘除四個case,這個思路暫且能夠接受,那未來我又要加餘數運算,平方運算,指數對數運算等等,假設我幾百個甚至更多個這樣相似的方法呢,那我豈不是要寫幾百個if,else,這樣作很明顯程序的擴展性會不好。因此咱們要換個思路,咱們徹底能夠經過一個方法把相同的部分封裝起來,而不一樣的部分經過參數傳過去,可是方法並不能直接被看成參數被傳遞和調用,那怎麼辦呢?,那麼這時候委託的做用就體現出來了,咱們能夠把委託做爲參數傳遞給封裝好了的方法,經過委託來動態的調用方法。」 結合我所說的思想,那麼上面封裝的部分就相似與咱們的Calculate方法,而不一樣的部分就是每一個加減乘除方法,你能夠假設Calculate是一個很是龐大的已經封裝好了的方法,而咱們傳進去的只是這個方法須要動態改變的部分,這樣就是最上面概念所謂的「方法動態地賦給參數」,這樣寫到好處是大大提高了方法的靈活性與擴展性,也減小了代碼的冗餘,因此委託在實際項目中是一個十分有用的工具,它可使你的代碼更加的」溫馨,健壯「。是否是感受對委託的理解有那麼一丟丟長進了,以後我還會繼續寫關於學習匿名方法,lambda表達式,泛型委託,以及事件的相關學習心得。以上言論是我本身參考資料,和項目實戰後本身作出的總結,若是又什麼不對的地方,但願各位大神指出^^。學習