事件
舉辦活動時:
- 始終檢查代表是否為
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 <>宣告委託型別時,匿名方法/事件處理程式簽名必須與事件宣告中宣告的匿名委託型別相同。