這篇文章主要介紹了C#如何實(shí)現(xiàn)委托,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
寧陵網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),寧陵網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為寧陵成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的寧陵做網(wǎng)站的公司定做!
我們首先來(lái)看一個(gè)非常簡(jiǎn)單的例子:
namespace LinQ { //聲明一個(gè)委托,這個(gè)委托可以指向任何傳入兩個(gè)整數(shù)并且返回一個(gè)整數(shù)的方法 public delegate int MathOP(int i, int j); //這個(gè)類包含了MathOP將指向的方法Add class DelegateMath { public static int Add(int i, int j) { return i + j; } } class Program { static void Main(string[] args) { //創(chuàng)建一個(gè)指向DelegateMath.Add()的委托 MathOP o = new MathOP(DelegateMath.Add); //使用委托間接調(diào)用Add()方法 Console.WriteLine("10+20={0}",o(10,20)); //或者可以這樣,如果不清楚o.Invoke,請(qǐng)繼續(xù)往下看。如果您知道了,那這篇文章就可以忽略了 Console.WriteLine("10+20={0}", o.Invoke(10, 20)); Console.ReadLine(); } } }
運(yùn)行結(jié)果是:
由這個(gè)簡(jiǎn)單的例子可見(jiàn)委托的使用非常簡(jiǎn)單,如果要將目標(biāo)對(duì)象方法插入指定委托,只要向委托的構(gòu)造函數(shù)傳入方法名即可,當(dāng)然這個(gè)方法要與定義這個(gè)委托時(shí)的返回值,參數(shù)類型以及個(gè)數(shù)都完全一樣。這是我們就可以使用類似直接函數(shù)調(diào)用的語(yǔ)法來(lái)調(diào)用指向的成員:DelegateMath.Add(int i,int j);
我們接著深入的討論一下這個(gè)委托。東西嘛,不能光看表面,尤其是社會(huì)上的淫。不多說(shuō),"深入"之,先看一副圖:
這是一個(gè)反編譯工具經(jīng)過(guò)反編譯之后出來(lái)的結(jié)果,主要看中間選中的那個(gè)LinQ.MathOP,這是我們定義的委托,它是一個(gè)類,但是我們并沒(méi)有為這個(gè)類添加了那么多的不知道從哪里來(lái)的方法啊。其實(shí)當(dāng)C#編譯器處理委托類型時(shí),它會(huì)先自動(dòng)生成一個(gè)派生自System.MulticastDelegate的密封類。這個(gè)類與它的基類:System.Delegate一起為委托提供必要的基礎(chǔ)設(shè)施??梢钥吹缴傻腗athOP類定義了三個(gè)公共方法。Invoke應(yīng)該是核心方法,因?yàn)樗挥脕?lái)以同步的方式調(diào)用委托類型維護(hù)的每個(gè)方法,這里所謂的同步就是指調(diào)用者必須等待調(diào)用完成才能繼續(xù)進(jìn)行。BeginInvoke()和EndInvoke()方法能在第二個(gè)執(zhí)行線程上異步調(diào)用當(dāng)前的方法,這兩個(gè)方法主要用在多線程上面,現(xiàn)在大家只要知道有這么個(gè)東西就行了,以后的博文會(huì)有持續(xù)的說(shuō)明。 LinQ.MathOP的偽代碼應(yīng)該是這樣的:
sealed class MathOP:System.MulticastDelegate { public MathOP(object target,uint functionAddress); public int Invoke(int i,int j); public IAsyncResult BeginInvoke(int i,int j,AsyncCallback cb,object state); public int EndInvoke(IAsyncResult result); }
最后說(shuō)明一下,委托還可以指向任意數(shù)量的out或ref參數(shù)(以及用params關(guān)鍵字標(biāo)記的數(shù)組)的方法。如果包含了out或者ref參數(shù),Invoke()以及BeginInvoke()方法的簽名是一樣的,但是EndInvoke()方法稍有變化,其中包括了委托類型定義的所有out或ref參數(shù),當(dāng)然,這個(gè)不需要我們的關(guān)心。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#如何實(shí)現(xiàn)委托”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
網(wǎng)頁(yè)題目:C#如何實(shí)現(xiàn)委托
瀏覽路徑:http://jinyejixie.com/article8/iisoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站導(dǎo)航、微信小程序、外貿(mào)建站、網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)