[C#筆記] 關鍵字 event 對 delegate 的影響 - what keyword event is doing.
踩雷了。決定還是好好搞清楚 event 這個關鍵字的效果,把過去以及剛剛所查過的資料統整筆記,這次還發現有對 IL 的分析,完全補足了官方文件對於這塊實作方式的說明。
怎麼 MSDN 上面的說明如此簡單然而不明確呢?
- 加上了 event 關鍵字,delegate 不再是一個實體成員。
- 加上了 event 關鍵字,則 delegate 的增減動作 (+= 及 -=),會由編譯器自動包裝成 property 的 add / remove 來運作。
- add / remove 是可以進行更多實作的,如:
1 | public event Action MyEvent { |
- 加上了 event 關鍵字,即使是 public member 形式的 delegate 也無法從外部直接執行 (invoke) ,可以避免誤用,必須另外實做方法來觸發 invoke,如:
1 | public event Action MyEvent; |
- interface 不能定義 delegate 欄位,但可以定義 event delegate 欄位。
- 加上 event 後記憶體開銷會 (似乎) 增加。
以結論來說,event 的存在是為了給類別外部使用 delegate 時,有更多完善的配置來避免誤用。尤其當開發時會將類別的事件 delegate 開放給其他類別註冊時,是個可以多多利用的關鍵字,多人開發時更是如此。 在 MSDN 還有提到,建議 event 要搭配 eventHandler 使用,來符合定名與定義的規範。但既然編譯器沒有強制,我才不想管這件事哩!
參考連結
- Delegates and Events - http://csharpindepth.com/Articles/Chapter2/Events.aspx
- C# events vs. delegates - http://blog.monstuff.com/archives/000040.html
- 關於 event 的優點討論 - http://stackoverflow.com/questions/18385967/c-sharp-event-keyword-advantages
- 關於 event 的 property 特性討論- http://stackoverflow.com/questions/6259273/what-does-the-event-keyword-really-do
- 關於記憶體開銷的測試文章 - http://jacksondunstan.com/articles/3264