事件
举办活动时:
- 始终检查代表是否为
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 <>声明委托类型时,匿名方法/事件处理程序签名必须与事件声明中声明的匿名委托类型相同。