2012-08-10 54 views
7

在從組件派生類的我有時會看到聲明如下事件:將委託實例添加到Component.Events(EventHandlerList)有什麼好處?

private static readonly object LoadEvent = new object(); 
public event EventHandler<MyEventArgs> Load 
{ 
    add { Events.AddHandler(LoadEvent, value); } 
    remove { Events.RemoveHandler(LoadEvent, value); } 
} 

protected virtual void OnLoad(MyEventArg e) 
{ 
    var evnt = (EventHandler<MyEventArg>)Events[LoadEvent]; 
    if (evnt != null) 
     evnt(this, e); 
} 

而不只是:

public event EventHandler<MyEventArgs> Load; 

protected virtual void OnLoad(MyEvent e) 
{ 
    if (Load != null) 
     Load(this, e); 
} 

我很想重構採用更短的方法,但我很猶豫如果使用我缺少的組件EventHanderList有一些優點。

我目前能想到的唯一的優點是:

  • 當組件配置,在EventHandlerList所有項目都刪除,有效地自動脫鉤事件處理程序。
  • 由於所有附加的委託進入單個EventHandlerList,可能會減少內存碎片。

還有別的嗎?

(這是不是關於一般使用明確的附加+消除了對事件的問題。)

回答

8

這有利於稀疏事件。 UI控件往往有數十個(有時超過100個)事件。如果每個事件都使用了一個字段事件,則每個事件都需要引用後備字段。有100個事件,即x86上的400個字節或x64上的800個字節,即使沒有訂閱單個事件,也可以使用

作爲示例,winforms System.Windows.Forms.Form有91個事件,然後再添加任何。每一個Control實例有至少 69.

所以;一個帶有幾個標籤,輸入框和按鈕的窗體可以很容易地有額外的2000個參考字段(x86上的16k),其中大部分沒有任何操作

EventHandlerList本質上是一個鍵/值查找,這意味着如果只有3個事件訂閱(我在想「點擊」,也許是其他幾個),那麼只需要一個標稱的內存量。

相關問題