C 事件 探尋事件本質

2021-08-25 13:04:22 字數 1404 閱讀 9001

如何定義乙個事件?

語法:訪問修飾符 event關鍵字 委託類名 事件名;

比如:public event somedelegatename myeventname;

事件到底是什麼型別(引用?值?)

事件其實就是乙個特殊的委託。

msdn中的c#參考裡這樣描述:事件是特殊型別的多路廣播委託,僅可從宣告它們的類或結構(發行者類)中呼叫。如果其他類或結構訂閱了該事件,則當發行者類引發該事件時,會呼叫其事件處理程式方法。

對於這一點,我們也可以從事件的定義中看出,不過就是在定義委託物件時加了event關鍵字表明這個委託現在叫事件。

何謂事件的訂閱(subscribe)?

我們用vs建立乙個只有乙個按鈕的winform程式,雙擊按鈕,設計器會在form1.designer.cs中自動生成一行**

this.button1.click += new system.eventhandler(this.button1_click);

這就是事件的訂閱!其實就是用事件處理函式this.button1_click來例項化乙個委託system.eventhandler(這個函式與委託擁有同樣的簽名),並把這個委託物件賦給事件click(因這click其實就是乙個委託引用,所以可以這樣做)

一句話,訂閱事件就是將某個委託物件指向乙個具體的方法。

什麼是引發事件?

當程式中滿足某個條件時呼叫事件就是引發了事件,為什麼可以呼叫事件呢?因為事件就是乙個委託,呼叫委託就是呼叫委託中封裝的事件處理函式。

為什麼事件可以被多個物件訂閱?

知道了事件實際是乙個多播委託後,這個問題不難理解,所謂被多個物件訂閱,就是事件被觸發後,可以導致多個物件做出反應,也就是多個物件的某個事件處理函式被呼叫。為什麼會這樣呢,因為事件是多播委託,即封裝了多個函式的委託,呼叫這個委託實際上就是在呼叫被封裝的這多個函式。

下面用乙個最簡單的控制台程式例子來說明事件的運作方式

using system;

namespace 最簡單的自定義事件}}

}///

/// 事件接收類,即事件處理的類

///

class class2

private static void c1_myevent(object sender, eventargs e)}}

對於這個例子,為了加深理解事件的本質,我們可以把事件訂閱c1.myevent+= new class1.mydelegate(c1_myevent); 這句注釋掉,即事件沒有指向任何具體的方法,編譯,不會報錯,執行它,如果我們不輸入

字串「a」,程式仍然執行正常,因為這時沒有滿足事件觸發條件,一旦輸入a回車,就會報如下錯誤:

未處理的異常:system.nullreferenceexception未將物件引用設定到物件例項。

很顯然,就是相當於我們呼叫了乙個沒有指向任何函式的函式指標。

探尋C 事件本質

我最先在學習c 事件的時候,閱讀了許多書籍,但總是不能對事件建立起乙個比較清晰的概念,對其內部機制和原理也是似是而非,因為這些書籍在描述事件的時候總是夾雜許多其他不能理解的抽象術語,相信許多初學者都有這樣的感覺。同時,在利用ide進行gui程式設計時,ide總是在內部幫助我們實現了事件必須的一些 我...

探尋C 事件本質1

我最先在學習c 事件的時候,閱讀了許多書籍,但總是不能對事件建立起乙個比較清晰的概念,對其內部機制和原理也是似是而非,因為這些書籍在描述事件的時候總是夾雜許多其他不能理解的抽象術語,相信許多初學者都有這樣的感覺。同時,在利用ide進行gui程式設計時,ide總是在內部幫助我們實現了事件必須的一些 我...

事件引入和本質

用event 關鍵字使您可以宣告事件。事件是類在相關事情發生時發出通知的方法。簡述 事件就是類在發生其關注的事情的時候用來提供通知的一種方式。要理解事件必須要先知道一下兩個角色 事件發行者,也稱為傳送者 sender 說白了就是乙個物件,這個物件會自身維護本身的狀態資訊。當自身狀態資訊發生變動時,就...