是否有必要让某人在事件发生之前注册参加活动?

Uma*_*med 4 c# events

这听起来很疯狂,但我在课堂上创建了一个活动,试图在没有任何人注册的情况下提高它.但是它会给出一个例外.在提出异常之前是否有必要让某人注册?如果是,那么有什么工作呢?

the*_*oop 14

是的,没有注册的事件为空.触发事件的标准方式是:

event EventHandler MyEvent;

private void FireMyEvent(EventArgs e) {
    var handler = MyEvent;
    if (handler != null)
        handler(this, e);
}
Run Code Online (Sandbox Code Playgroud)

Eric Lippert撰写了一篇很棒的文章,讲述为什么这种模式是发射事件的"正确"方式


adr*_*nks 5

是.如果没有订阅者,则该事件将为null,并且在调用它时将获得NullReferenceException.正如theco所说的那样,正确的检查方式是,但有一个简单的"捷径":

public event EventHandler Event = delegate {};
Run Code Online (Sandbox Code Playgroud)

这会导致事件的默认订阅者不执行任何操作,因此如果有订阅者,则不会抛出异常.这样做会有轻微的性能开销,但它确实不需要检查空值.