2010-04-15 96 views

回答

6

如果你輸入:

public event EventHandler MyEvent; 

什麼編譯器生成的(簡化)這樣的:

// declares a normal delegate of type 'EventHandler' 
private EventHandler _myEvent; 

// declares 'add_MyEvent' and 'remove_MyEvent' methods similar to a property 
public event EventHandler MyEvent { 
    add { _myEvent += value; } 
    remove { _myEvent -= value; } 
} 

事件是類似的屬性;一個僅允許添加或刪除方法的代理的包裝器。這是因爲您無法完全重新分配委託並刪除其他人的訂閱。

在接口中指定事件時所做的全部工作是任何實施類應該有事件的addremove方法。事實上,非常類似於在界面上聲明屬性。

這也是爲什麼您只能在聲明的類中調用或重新分配事件的原因 - 類中的任何對MyEvent事件的引用都會重新路由以直接使用該委託,而在課外只能訪問addremove方法,不能直接委託。

+0

而「簡化」即將接近你可以在無需討論至少3種不同的編譯器實現;-p – 2010-04-15 11:47:32

0

事件不會表示爲字段也沒有方法。就類別的元數據而言,它們僅僅是事件。

同樣性質有一個特殊的標誌(儘管這些獲取存儲與衆所周知的名稱的方法)。

2

@ thecoop的回答是「類似場景的事件」(注意「簡化」警告)的一個非常好的描述 - 但請注意,實際上您可以使用任何方式執行。所有的事件定義爲add/remove存取對(這就是爲什麼它可以在接口上被定義,就像一個屬性)。

例如,sparce事件以下可能是共同的:

private static readonly object FooKey = new object(), BarKey = new object(); 

public event EventHandler Foo { 
    add {Events.AddHandler(FooKey, value);} 
    remove {Events.RemoveHandler(FooKey, value);} 
} 
public event MouseClickEventHandler Bar { 
    add {Events.AddHandler(BarKey, value);} 
    remove {Events.RemoveHandler(BarKey, value);} 
} 

其中EventsEventHandlerList,通常延遲加載:

private EventHandlerList events; 
protected EventHandlerList Events { 
    get { 
     if(events == null) events = new EventHandlerList(); 
     return events; 
    } 
} 

或者你可以做任何你喜歡的。理性之內(注意事件訂閱和委託相等/合成代理的預期行爲)。

+0

我與事件的方法做的另一件美妙的事情是實現一個直接的途徑,通過對一個事件得到子控件(用於winforms):) – thecoop 2010-04-15 12:34:09

相關問題