如何理解委托與事件 從事C#工作者,只有理解了委托和事件其中的奧秘,才算得上C#入門。我認為,只有懂得了什麼是委托,如何用委托鏈製造事件,才算正式進入了C#的世界。否則,你只是一個C語言編程者。 1.什麼是委托 委托,其實質是一個函數指針,但在C#中,本著萬物皆對象的原則,委托是一個類(故可以寫在命 ...
如何理解委托與事件
從事C#工作者,只有理解了委托和事件其中的奧秘,才算得上C#入門。我認為,只有懂得了什麼是委托,如何用委托鏈製造事件,才算正式進入了C#的世界。否則,你只是一個C語言編程者。
1.什麼是委托
委托,其實質是一個函數指針,但在C#中,本著萬物皆對象的原則,委托是一個類(故可以寫在命名空間裡面),通過IL代碼可以看出,委托有自己的構造函數與成員函數。
在程式中使用委托,通常分為3個部分,定義委托,定義委托相當於為委托寫好了一個標簽;實例化委托,實例化委托對象相當於給一個對象貼上標簽,同時實例本身也符合標簽定義;方法處理器,實例化的委托對象中就將方法名(指針)當構造參數傳入對象,此時,應該將方法處理器具體執行步驟編碼實現。
委托在程式中,有3大作用:
- 跨線程調用方法,例如,子線程跨到主線程UI去操作其控制項;
- 將一種委托方法(行為)作為一個函數參數進行傳遞;
- 構造委托鏈,進行鏈式執行方法,實現跨窗體、類庫傳遞行為方法的一種方式。
2.什麼是事件
想要更加深入地去理解委托,那麼我們就該去瞭解什麼是事件了。在C#中,控制項觸發的事件,隨處可見,可大部分新手,其實並不知道事件的本質是什麼,也不知自己又如何去定義一個事件。其事件的本質是一個多路廣播委托鏈的實例對象。此處,重點強調,事件是一個已經被實例化的對象(故只能寫在類裡面)。雖然事件本質上是委托,但也同時與委托有著實質區別。
在程式中,我們自己去定義一個事件,通常也是分為3個部分,定義委托,此處也可以使用預定義委托類型EventHandler,兩者的區別在於,自定義委托,是自己來寫這個委托的標簽(即返回值以及函數參數),而EvenHandler委托,預設無返回值,傳入sender和EventArgs兩個參數;發佈事件,將委托定義好標簽後,便需要將委托標簽發佈出去,從而定義成事件,事件的形式與委托形式相同(其本質將其實例化委托對象);訂閱事件,在實例化的委托對象(即事件)添加函數方法即可完成訂閱。
3.多路廣播委托鏈與事件的區別
看了這麼多,想必大家也明白了委托與事件的關係。但多路廣播委托鏈與事件到底又有何區別呢?微軟在.NET的平臺上,最喜歡做的一件事,就是不斷地優化程式底層代碼,來讓程式員更多地關註程式業務邏輯。其實,事件的本質就是多路廣播委托鏈的一種結構式封裝。
多路廣播委托鏈與事件有兩點區別:
- 多路廣播委托鏈,需要用一個委托去實例化;而事件定義後,便不需要所謂的實例化(其本質是將委托對象實例化)。
- 多路廣播委托鏈,在添加新的委托時,需要實例化一個委托而後進行添加;而事件定義後,進行訂閱事件,只需要添加函數方法即可(其本質是將一個實例化委托添加)。
如何還想對委托和事件有更深入地更直接地理解,可以自己定義委托和事件,去查看IL代碼,分析其運行的本質。