初入社會,對於我這個初級程序員來說要學的東西實在太多了,公司最近在做一個winform框架開發的桌面應用程序,眾所周知,winform也好,webform也好,里面隨處可見的事件驅動,有事件,當然也少不了委托,感覺之前對委托這個概念的理解一直是模模糊糊的,口里都會背的那么幾句話:“委托可以把方法當作參數在另一個方法中傳遞和調用”,“委托是方法的快捷方式”等等。但是真要深入理解,靈活運用,還是要有良好的代碼理解功底和面向對象基礎的,今天就再來把委托這個知識梳理梳理,以加深對它的理解。
要理解委托,我們首先要知道委托的概念:
”委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用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兩種方式進行調用,這里我們要知道委托也是一種類型,所以它和類是同級的,可以通過委托來掉用方法,不要誤以為委托和方法同級的,方法只是類的成員,還有定義委托和與之對應的方法必須具有相同的方法簽名,即參數個數,類型相同,返回值類型相同,上面代碼實例沒有什么實際意義,只是然我們知道委托的結構以及委托與方法的關系
(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表達式,泛型委托,以及事件的相關學習心得。以上言論是我自己參考資料,和項目實戰后自己做出的總結,如果又什么不對的地方,希望各位大神指出^^。