相信你們在面試的時候會常常問到事件和委託的區別,爲何.net中須要事件和委託這樣相似的問題吧,對於一些初學者來講可平時用的過程當中也不知道爲何, 只知道這樣用,而對於其中的實現機制不是很清楚, 因此面試的時候老是感受回答的不是頗有底氣的, 對於委託和事件園子裏面也有不少人寫過這樣的文章,好比張子陽博客中C# 中的委託和事件, 這篇文章由淺入深講解了.net中的事件和委託。因此比較建議初學者看看的,並且很容易懂.(本人第一次寫,若是什麼地方說錯了的地方請你們海涵和及時糾正我)javascript
在張子陽的文章我相信已經把事件和委託講的很清楚了,下面我說說我感受須要注意的地方。java
在C++中用函數指針來實現回調函數(回調函數是一種很是有用的編程機制),然而函數指針不是類型安全的, 因此.net Framework提供了稱爲委託的類型安全的機制來實現函數的回調。面試
當咱們像下面同樣在代碼中定義一個委託時,編程
Public delegate void Comparator(int value);安全
可是編譯器遇到這行代碼會定義一個類:ide
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;
編譯器在編譯事件的時候會把它轉換爲三個構造:spa
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幾本書, 由於我感受不少初學者不知道買什麼書來學習。
如今關於C# 方面的書籍不少,因此對於一些初學者來講不知道怎麼選擇, 我推薦上面兩本書,若是認真的看完的話, 我相信你確定對.net 會有必定的理解, 而後經過項目實踐的方式對書中內容進行鞏固。我的以爲要深刻理解程序底層的東西, 有必要閱讀一些關於操做系統和編譯器相關的書籍,本人一貫提倡「知其然知其因此然」的學習方式。
在此推薦一本操做系統相關的書籍: 深刻理解計算機系統 (美)布萊恩特,奧哈拉倫 著 龔奕利,雷迎春 譯 機械工業出版社。
但願這篇文章對你們會有幫助。