引言:
上一個專題已經(jīng)和大家分享了我理解的——C#中為什么需要委托,專題中簡單介紹了下委托是什么以及委托簡單的應(yīng)用的,在這個專題中將對委托做進(jìn)一步的介紹的,本專題主要對委本質(zhì)和委托鏈進(jìn)行討論。
一、委托的本質(zhì)
平時我們很容易使用委托——用C#delegate關(guān)鍵字定義委托,再用new操作符構(gòu)造委托實例,然后通過調(diào)用委托實例來調(diào)用回調(diào)方法(就是用一個了委托對象的變量來代替方法名,這句話如果剛接觸的人不好理解的話,這里給個例子:MyDelegate mydelegate =new Mydelegate(obj.mymethod),MyDelegate是定義的一個委托,假設(shè)定義的是沒有參數(shù)的,然后調(diào)用委托實例是這樣的——mydelegate(), 大家可以發(fā)現(xiàn)此時調(diào)用委托和調(diào)用方法的方式是一模一樣的,如果沒有看前面mydelegate是個委托類型,大家都會認(rèn)為這是直接調(diào)用一個方法,而不是調(diào)用委托實例,通過這個例子大家應(yīng)該很容易明白了這句話了吧——用一個委托對象的變量來代替方法名),相信通過括號內(nèi)的講解后,相信大家又會對委托有進(jìn)一步的理解的——委托就是方法的代替品,委托變量此時著方法名,大家可以簡單理解委托是方法的一個 “外號”。
前面的都介紹了委托的一些使用和理解的,現(xiàn)在就讓我我們來進(jìn)一步看看編譯器和CLR在背后對我們用delegate關(guān)鍵字定義的委托類型做了些什么事情的,前一個專題中我和大家說過委托是一個類,這么是有根據(jù)的,因為我們在IDE中定義一個委托類型時,最終是通過編譯器將定義的代碼轉(zhuǎn)化為中間語言IL,然后再執(zhí)行中間語言中的代碼來轉(zhuǎn)化為本機(jī)代碼的,所以在Visual Studio中編寫的代碼只是一個包裝而已,真真程序執(zhí)行的是中間語言中的代碼的。現(xiàn)在就看看編譯器把我們定義的委托類型轉(zhuǎn)化為什么樣的中間語言代碼的。
當(dāng)我們在類中像下面這樣定義一個委托時:
public delegate void DelegateTest(int parm);
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。