2012-07-31 61 views
4

執行事件時,可以提供代碼addremove事件處理程序。然而,事件可以通過三種方式獲得:爲什麼事件不提供3個訪問器方法?

MyEvent += Handler;    // add accessor 
MyEvent -= Handler;    // remove accessor 
MyEvent(this, EventArgs.Empty); // not supported by an accessor 

豈不是明顯有被稱爲invoke另一個訪問,負責呢?我的想法是:

class BaseClass 
{ 
    public virtual event EventHandler MyEvent { add; remove; protected invoke; } 
} 

class DerivedClass : BaseClass 
{ 
    public override event EventHandler MyEvent 
    { 
    invoke 
    { 
     // new code before event 
     base.MyEvent(this, ...); 
     // new code after event 
    } 
    } 
} 

我知道old-style pattern,這是實施OnMyEvent(...)方法。但有兩次與該方法重要的缺點:

  1. 事件代碼分散 - >組織化程度較低的代碼庫
  2. 你不能簡單的重構事件(例如,將其重命名)

編輯:很明顯,編譯器團隊已經爲此功能而設計(請參閱GetRaiseMethod())。

回答

5

這是有目的的,所以你不要調用你不「擁有」的事件。

編輯(以解決您的編輯問題):即使在繼承類中,您是否應始終能夠調用它仍不清楚。一般是,因此,共用圖案是公列明:

  • 定義(On前綴)
  • 創建具有相同名稱的受保護的虛擬方法,但用On前綴一個事件,它接受適當的EventArgs,只是null檢查和調用。
  • 始終通過虛擬方法

該模式允許更大的靈活性引發事件;可以通過繼承該方法來更改或忽略事件或執行事件後處理。如果不存在方法,則該事件調用是私有的。

+0

你是什麼意思的「自己」? – Matthias 2012-07-31 09:41:18

+1

如果你可以去做'button1.Click(...)',那麼它會引發事件,而不會被按鈕本身觸發。只有Button類應該能夠引發事件。這就是爲什麼你可以在定義它的類中調用它,但不能以其他方式調用它。 – Lucero 2012-07-31 09:43:44

+0

我知道。添加了更多的解釋。希望這個幫助。 – Matthias 2012-07-31 09:48:40

相關問題