2013-04-10 58 views
0
public delegate void EventHandler(object sender, EventArgs e); 
public class Button: Control 
{ 
    public event EventHandler Click; 
    protected void OnClick(EventArgs e) { 
     if (Click != null) Click(this, e); 
    } 

}澄清事件調用

這本書解釋了上述通過以下方式代碼:

Button類的onclick方法 「引發」 Click事件。提出事件的概念恰恰相當於調用由事件代表的 代表 - 因此,沒有用於引發事件的特殊語言結構。請注意,代理 調用之前有一個檢查,確保代理是非空的 。

爲什麼它暗示在每個事件處理程序都有一個委託實例時,事件中只有一個委託?一個實例是一個實例,一個事件可以包含許多連接到實際方法的委託實例。

我會非常感激,如果有人可以使這個段落感對我來說。

回答

0

現在這是什麼意思的「事件代表的代表」?

這是事件的樣子從這個角度說提高它的代碼。使用標準方法調用語法(相對於某些「特殊」語法)引發該事件,該語法又調用所有訂閱的事件處理程序in no particular order

「確保代理非空的檢查」是什麼意思?

如果沒有訂閱該事件的事件處理程序,那麼「代表事件的委託」爲空。因此,要提高的情況下,你應該做這樣的事情:

class MyClass { 

    public delegate void MyEventHandler(MyEventArg arg); 

    public event MyEventHandler MyEvent; 

    void RaiseMyEvent(MyEventArg arg) { 
     var handler = MyEvent; 
     if (handler != null) // Any subscribers? 
      handler(arg); 
    } 

} 

BTW,複製事件的局部變量(handler)被認爲是一個很好的做法,爲this reason

+0

它爲什麼暗示事件中只有一個代表?我的意思是,該事件是一個用委託類型聲明的函數成員。意思是,該委託類型和簽名的委託類型引用方法的實例作爲事件處理程序添加到事件中。 – 2013-04-10 03:08:00

+0

@ user2247389 _「爲什麼它暗示事件中只有一個代表?」_因爲有。該代表然後調用所有其他代表(即訂閱該事件的事件處理程序)。 – 2013-04-10 03:12:26

+0

但是,一個委託只能引用一個方法,除非它是一個複合委託。我們有與一個事件處理程序關聯的委託類型的每個實例。這個稱爲其他代表的單一代表從哪裏來?它是由事件中的所有實例委託組成的複合委託實例嗎? – 2013-04-10 03:21:18