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

踩雷了。

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

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

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

以結論來說,event 的存在是為了給類別外部使用 delegate 時,有更多完善的配置來避免誤用。尤其當開發時會將類別的事件 delegate 開放給其他類別註冊時,是個可以多多利用的關鍵字,多人開發時更是如此。

在 MSDN 還有提到,建議 event 要搭配 eventHandler 使用,來符合定名與定義的規範。但既然編譯器沒有強制,我才不想管這件事哩!

參考連結

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s