相信大家在面試的時候會經常問到事件和委托的區別,為什么.net中需要事件和委托這樣類似的問題吧,對於一些初學者來說可平時用的過程中也不知道為什么, 只知道這樣用,而對於其中的實現機制不是很清楚, 所以面試的時候總是感覺回答的不是很有底氣的, 對於委托和事件園子里面也有很多人寫過這樣的文章,比如張子陽博客中C# 中的委托和事件, 這篇文章由淺入深講解了.net中的事件和委托。所以比較建議初學者看看的,而且很容易懂.(本人第一次寫,如果什么地方說錯了的地方請大家海涵和及時糾正我)
在張子陽的文章我相信已經把事件和委托講的很清楚了,下面我說說我感覺需要注意的地方。
為什么會有委托
在C++中用函數指針來實現回調函數(回調函數是一種非常有用的編程機制),然而函數指針不是類型安全的, 所以.net Framework提供了稱為委托的類型安全的機制來實現函數的回調。
編譯器如何解析委托
當我們像下面一樣在代碼中定義一個委托時,
Public delegate void Comparator(int value);
但是編譯器遇到這行代碼會定義一個類:

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 }
從上面代碼可以知道 委托 也是一個類,其中有一個構造器,Invoke方法,BeginInvoke方法 和EndInvoke方法。構造器有兩個參數,對象引用傳給構造器的Object參數,方法的引用傳給method 參數,對於靜態方法,會為Object 參數傳遞null.
事件
先看一個事件的定義:
//定義事件委托(代理) public delegate void Comparator(int value1,int value2); //定義事件 public event Comparator onComparator;
編譯器在編譯事件的時候會把它轉換為三個構造:
private Comparator onComparator = null; public void add_onComparator(Comparator value) { // 以一種線程安全的方式對事件添加一個委托 } public void remove_onComparator(Comparator value) { // 以一種線程安全的方式對事件移出一個委托 }
從上面代碼可以看出第一部分是申明一個私有的委托字段, 后面兩部分是對這個委托字段的add訪問器和remove 訪問器,我們知道屬性中有get 和set 訪問器,其實事件就是委托字段的訪問器,只是訪問器方法用add 和remove,而屬性用get和set.
總結:
到這里我要講的差不多說完了, 這是我第一次寫文章,盡管上面的內容理解的不是很深入,但是我只是想通過這樣的方式來鞏固自己看到的知識,因為我覺得這樣可以記錄下我不同時段對知識的理解以及寫的時候自己也在不斷思考,這樣會有利於對知識的理解。
最后我為初學者推薦關於深入理解.net Framework幾本書, 因為我感覺很多初學者不知道買什么書來學習。
- CLR via C# (第三版) 作者:Jeffrey Richter (周靖譯) 清華大學出版社
- 深入理解C#(第2版)作者:Jon Skeet 周靖(譯)人民郵電出版社
現在關於C# 方面的書籍很多,所以對於一些初學者來說不知道怎么選擇, 我推薦上面兩本書,如果認真的看完的話, 我相信你肯定對.net 會有一定的理解, 然后通過項目實踐的方式對書中內容進行鞏固。個人覺得要深入理解程序底層的東西, 有必要閱讀一些關於操作系統和編譯器相關的書籍,本人一向提倡“知其然知其所以然”的學習方式。
在此推薦一本操作系統相關的書籍: 深入理解計算機系統 (美)布萊恩特,奧哈拉倫 著 龔奕利,雷迎春 譯 機械工業出版社。
希望這篇文章對大家會有幫助。
作者:Learning hard
出處:http://www.cnblogs.com/zhili/