2009-04-15 179 views
0


爲什麼派生類在不附加委託的情況下處理事件?

Q1:

「的ListControl.OnSelectedIndexChanged方法還允許派生類對事件進行處理而不必附加委託。這是在派生類中處理事件的首選技術「。


A)如果我理解了上面的報價,那麼如果我們推導自ListControl類,我們應該的,而不是訂閱SelectedIndexChanged事件,治療OnSelectedIndexChanged()方法作爲一個事件處理程序,並從而把它裏面的任何事件處理邏輯:

protected override void OnSelectedIndexChanged(
EventArgs e 
{ 
    //event handling logic 
} 

爲什麼會是這樣比通過OnSelectedIndexChanged =「name_of_event_handler」訂閱的事件(內側的.aspx)更好?


B) 不管怎麼說,在ASCX文件中,我們使用OnSelectedIndexChanged屬性,事件處理程序附加到事件。該屬性的名稱與OnSelectedIndexChanged()方法的名稱相同。這是爲什麼?爲什麼不是代替這個屬性的名稱的SelectedIndexChanged:

<asp:ListControl SelectedIndexChanged = 」name_of_event_handler」 

畢竟,屬性指的是事件,而不是一個方法(OnSelectedIndexChanged())調用此事件!


感謝名單


編輯:

你好,

但是,要確保你打電話base.On [事件名稱]或事件贏了' t火!

假設你不希望其他人能夠響應這個事件,那麼是否完全可以不調用base.On [EventName],因爲我認爲不會調用它不會真的除了不發射事件(因此事件處理程序不會被調用)之外還有什麼傷害?

我意識到一些事件需要被解僱才能讓Framework完成它的工作,但是如果不調用base.On [SelectedIndexChanged]呢?

回答

1

通常,我更喜歡重寫On [EventName]函數,以便可以控制我的邏輯是在任何訂戶的邏輯之前還是之後發生。

但是,請確保您調用base.On [EventName]或事件不會觸發!

4

正是在這種「更好」:

  • 它是便宜使用virtual(繼承)如果可能的話 - 它刪除了一些額外的對象需要(委託實例等)
  • 它允許壓倒一切的代碼來知道它在序列中的位置 - 即如果多個呼叫者正在監聽,它是否會首先啓動?第二?在中間?

第一點是爲了效率可以說是更重要的,尤其是在這樣的事情有稀疏的事件處理程序的控制(即之類的東西EventHandlerList代替場樣事件)。

我真的不明白第二個問題,但在猜測:約定。

相關問題