事件

舉辦活動時:

  • 始終檢查代表是否為 null。空委託表示該事件沒有訂閱者。在沒有訂閱者的情況下舉辦活動將產生一個節目。

Version < 6

  • 在檢查 null /引發事件之前,將委託(例如 EventName)複製到區域性變數(例如 eventName)。這避免了多執行緒環境中的競爭條件:

錯了

    if(Changed != null)      // Changed has 1 subscriber at this point
                             // In another thread, that one subscriber decided to unsubscribe
        Changed(this, args); // `Changed` is now null, `NullReferenceException` is thrown.

    // Cache the "Changed" event as a local. If it is not null, then use
    // the LOCAL variable (handler) to raise the event, NOT the event itself.
    var handler = Changed;
    if(handler != null)
        handler(this, args);

Version > 6

  • 使用空條件運算子(?。)來提升方法,而不是在 if 語句中對訂閱者的委託進行空值檢查:EventName?.Invoke(SenderObject, new EventArgsT());

  • 使用 Action <>宣告委託型別時,匿名方法/事件處理程式簽名必須與事件宣告中宣告的匿名委託型別相同。