使用委托的優(yōu)點(diǎn),委托和事件的區(qū)別和聯(lián)系
Posted on 2007-09-14 09:45 紅子 閱讀(5497) 評(píng)論(2) 編輯 收藏 所屬分類: C#/.NET 、設(shè)計(jì)模式C#中的委托類似于C或C++中的函數(shù)指針。使用委托使程序員可以將方法引用封裝在委托對(duì)象內(nèi)。然后可以將該委托對(duì)象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法。與C或C++中的函數(shù)指針不同,委托是面向?qū)ο螅沂穷愋桶踩摹?
C#中的“事件”是當(dāng)對(duì)象發(fā)生某些事情時(shí),類向該類的客戶提供通知的一種方法。事件最常見(jiàn)的用途是用于圖形用戶界面;通常,表示界面中的控件的類具有一些事件,當(dāng)用戶對(duì)控件進(jìn)行某些操作(如單擊某個(gè)按鈕)時(shí),將通知這些事件。
使用委托來(lái)聲明事件。委托對(duì)象封裝一個(gè)方法,以便可以匿名調(diào)用該方法。事件是類允許客戶為其提供方法(事件發(fā)生時(shí)應(yīng)調(diào)用這些方法)的委托的一種方法。事件發(fā)生時(shí),將調(diào)用其客戶提供給它的委托。
注明:委托是對(duì)方法的包裝 在不確定要調(diào)用什么方法時(shí)候而又不能用抽象或者多態(tài)實(shí)現(xiàn)的時(shí)候用委托。
比如一個(gè)button,當(dāng)點(diǎn)擊肯定要觸發(fā)事件,做一些處理,如果你是這個(gè)控件的開(kāi)發(fā)者,你怎么知道當(dāng)點(diǎn)擊是要處理什么?你這個(gè)button會(huì)被什么容器所包含?所以你必須公布一個(gè)event出去,用控件的人具體去實(shí)現(xiàn)其功能。
參考:
1、如下情況宜使用委托:
只調(diào)用單個(gè)方法時(shí).
當(dāng)一個(gè)類需要方法說(shuō)明的多重執(zhí)行時(shí).
期望使用靜態(tài)方法執(zhí)行規(guī)范時(shí).
期望得到一個(gè)類似事件的模式時(shí).
調(diào)用者無(wú)需知道無(wú)需獲取定義方法的對(duì)象時(shí)
只想給少數(shù)既定組件分發(fā)執(zhí)行規(guī)范時(shí).
想要簡(jiǎn)單的組成結(jié)構(gòu)時(shí).
2、如下情況宜使用接口:
當(dāng)規(guī)范定義了一組需要調(diào)用的相關(guān)方法時(shí).
一個(gè)類僅代表性地執(zhí)行一次規(guī)范時(shí).
接口的調(diào)用者想映射接口類型以獲取其他類或接口時(shí)
3、對(duì)函數(shù)指針以.net的方式進(jìn)行的封裝,其實(shí)就是一個(gè)class。
應(yīng)用最多的就是事件,在事件的情況下委托就變成了對(duì)回調(diào)函數(shù)指針的封裝。
推薦:看看《.net框架程序設(shè)計(jì)》(李建忠譯)