相信大家在面試的時候會經(jīng)常問到事件和委托的區(qū)別,為什么.net中需要事件和委托這樣類似的問題吧,對于一些初學(xué)者來說可平時用的過程中也不知道為什么, 只知道這樣用,而對于其中的實現(xiàn)機制不是很清楚, 所以面試的時候總是感覺回答的不是很有底氣的, 對于委托和事件園子里面也有很多人寫過這樣的文章,比如張子陽博客中C# 中的委托和事件, 這篇文章由淺入深講解了.net中的事件和委托。所以比較建議初學(xué)者看看的,而且很容易懂.(本人第一次寫,如果什么地方說錯了的地方請大家海涵和及時糾正我) 在張子陽的文章我相信已經(jīng)把事件和委托講的很清楚了,下面我說說我感覺需要注意的地方。 為什么會有委托在C++中用函數(shù)指針來實現(xiàn)回調(diào)函數(shù)(回調(diào)函數(shù)是一種非常有用的編程機制),然而函數(shù)指針不是類型安全的, 所以.net Framework提供了稱為委托的類型安全的機制來實現(xiàn)函數(shù)的回調(diào)。 編譯器如何解析委托當(dāng)我們像下面一樣在代碼中定義一個委托時, Public delegate void Comparator(int value1, int value2); 但是編譯器遇到這行代碼會定義一個類:
![]() ![]() 1 Public class Comparator:System.MulticastDelegate 2 { 3 public Comparator(Object object, IntPtr method); 4 5 public virtual Void Invoke(Int32 value); 6 7 public virtual IAsyncResult BeginInvoke(Int32 vlaue, AsyncCallback callback, Object object ); 8 9 public virtual void EndInvoke(IAsyncResult result); 10 11 } 從上面代碼可以知道 委托 也是一個類,其中有一個構(gòu)造器,Invoke方法,BeginInvoke方法 和EndInvoke方法。構(gòu)造器有兩個參數(shù),對象引用傳給構(gòu)造器的Object參數(shù),方法的引用傳給method 參數(shù),對于靜態(tài)方法,會為Object 參數(shù)傳遞null.
事件先看一個事件的定義:
//定義事件委托(代理) public delegate void Comparator(int value1,int value2); //定義事件 public event Comparator onComparator;
編譯器在編譯事件的時候會把它轉(zhuǎn)換為三個構(gòu)造: private Comparator onComparator = null; public void add_onComparator(Comparator value) { // 以一種線程安全的方式對事件添加一個委托 } public void remove_onComparator(Comparator value) { // 以一種線程安全的方式對事件移出一個委托 } 從上面代碼可以看出第一部分是申明一個私有的委托字段, 后面兩部分是對這個委托字段的add訪問器和remove 訪問器,我們知道屬性中有g(shù)et 和set 訪問器,其實事件就是委托字段的訪問器,只是訪問器方法用add 和remove,而屬性用get和set. 總結(jié):
到這里我要講的差不多說完了, 這是我第一次寫文章,盡管上面的內(nèi)容理解的不是很深入,但是我只是想通過這樣的方式來鞏固自己看到的知識,因為我覺得這樣可以記錄下我不同時段對知識的理解以及寫的時候自己也在不斷思考,這樣會有利于對知識的理解。 最后我為初學(xué)者推薦關(guān)于深入理解.net Framework幾本書, 因為我感覺很多初學(xué)者不知道買什么書來學(xué)習(xí)。
|
|
來自: 昵稱10504424 > 《C#》