[C#筆記] 關鍵字 event 對 delegate 的影響 - what keyword event is doing.

踩雷了。決定還是好好搞清楚 event 這個關鍵字的效果,把過去以及剛剛所查過的資料統整筆記,這次還發現有對 IL 的分析,完全補足了官方文件對於這塊實作方式的說明。

怎麼 MSDN 上面的說明如此簡單然而不明確呢?

  • 加上了 event 關鍵字,delegate 不再是一個實體成員。
  • 加上了 event 關鍵字,則 delegate 的增減動作 (+= 及 -=),會由編譯器自動包裝成 property 的 add / remove  來運作。
  • add / remove 是可以進行更多實作的,如:
1
2
3
4
5
6
7
8
public event Action MyEvent { 
add {
Console.WriteLine ("add operation");
}
remove {
Console.WriteLine ("remove operation");
}
}
  • 加上了 event 關鍵字,即使是 public member 形式的 delegate 也無法從外部直接執行 (invoke) ,可以避免誤用,必須另外實做方法來觸發 invoke,如:
1
2
3
4
public event Action MyEvent;
public void InvokeEvent () {
MyEvent ();
}
  • interface 不能定義 delegate 欄位,但可以定義 event delegate 欄位。
  • 加上 event 後記憶體開銷會 (似乎) 增加。

以結論來說,event 的存在是為了給類別外部使用 delegate 時,有更多完善的配置來避免誤用。尤其當開發時會將類別的事件 delegate 開放給其他類別註冊時,是個可以多多利用的關鍵字,多人開發時更是如此。 在 MSDN 還有提到,建議 event 要搭配 eventHandler 使用,來符合定名與定義的規範。但既然編譯器沒有強制,我才不想管這件事哩!

參考連結