回答
如果你輸入:
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; }
}
事件是類似的屬性;一個僅允許添加或刪除方法的代理的包裝器。這是因爲您無法完全重新分配委託並刪除其他人的訂閱。
在接口中指定事件時所做的全部工作是任何實施類應該有事件的add
和remove
方法。事實上,非常類似於在界面上聲明屬性。
這也是爲什麼您只能在聲明的類中調用或重新分配事件的原因 - 類中的任何對MyEvent
事件的引用都會重新路由以直接使用該委託,而在課外只能訪問add
和remove
方法,不能直接委託。
事件不會表示爲字段也沒有方法。就類別的元數據而言,它們僅僅是事件。
同樣性質有一個特殊的標誌(儘管這些獲取存儲與衆所周知的名稱的方法)。
@ 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);}
}
其中Events
是EventHandlerList
,通常延遲加載:
private EventHandlerList events;
protected EventHandlerList Events {
get {
if(events == null) events = new EventHandlerList();
return events;
}
}
或者你可以做任何你喜歡的。理性之內(注意事件訂閱和委託相等/合成代理的預期行爲)。
我與事件的方法做的另一件美妙的事情是實現一個直接的途徑,通過對一個事件得到子控件(用於winforms):) – thecoop 2010-04-15 12:34:09
- 1. jQuery事件內部事件
- 2. 事件內部的jQuery日曆事件
- 3. jQuery HeapBox「this」內部事件
- 4. 強制事件在內部觸發
- 5. C#內部代表和公共事件
- 6. jQuery如何防止事件內部的事件功能
- 7. 軟件事件如何在內部工作?
- 8. 如何防止在內部點擊事件中切換?
- 9. 如何在全局和內部requireJS對象中分派事件?
- 10. 在事件分接中檢測內部或外部設備
- 11. 來自DataBound控件內部的事件
- 12. 爲什麼類中的內部事件不能在內部接口上實現事件?
- 13. 顯示keyup事件和內部值的結果如何?
- 14. wxPython:處理筆記本內部的小部件中的事件
- 15. 在WinJS中如何避免外部div事件處理程序影響內部div事件處理程序
- 16. jQuery的內部事業部
- 17. 在jQuery中處理qooxdoo內聯小部件事件
- 18. 使用react-keydown在內部組件中捕獲keydown事件
- 19. AngularJS如何在內部捕捉像'onclick','onchange'這樣的事件?
- 20. 事件處理在JavaScript內部如何工作?
- 21. 事件委託如何在Javascript內部工作
- 22. 從內部類向外部類提升事件在c#
- 23. Delphi組件開發 - 在組件內部傳播事件
- 24. 如何在QT中的另一個小部件內部部件?
- 25. Watir單擊iFrame內部的事件?
- 26. 事件的內部存儲機制
- 27. jQuery的單擊事件內部形狀
- 28. Dropzone.js AMD內部Backbone視圖事件
- 29. 模型內部的金字塔事件
- 30. 從內部調用JavaScript函數事件
而「簡化」即將接近你可以在無需討論至少3種不同的編譯器實現;-p – 2010-04-15 11:47:32