委托学习总结(一)浅谈对C#委托理解
要理解委托,我們首先要知道委托的概念:
”委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用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表達式,泛型委托,以及事件的相關學習心得。以上言論是我自己參考資料,和項目實戰后自己做出的總結,如果又什么不對的地方,希望各位大神指出^^。
總結
以上是生活随笔為你收集整理的委托学习总结(一)浅谈对C#委托理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序猿必知的MySQL闪回原理
- 下一篇: COCO 数据集的使用