事件

举办活动时:

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