分配给空委托的事件声明

我对我经常偶然发现的一段代码有疑问。 例如

public static event Action foo = delegate{ }; 

我得到了宣言的左侧。 但右手方面令人困惑。 将事件分配给具有空括号的委托有什么意义?

更新:在现代版本的C#中,推荐使用的模式是将其保留为null并使用?. 运营商:

 event Action foo; // leave it as null as the default // ... foo?.(new Foo()); 

在旧版本的C#中,此模式的原因可能是event字段的默认值为null 。 这需要在每次想要引发事件时使用空检查 – 在未初始化的event字段上调用foo()会导致NullReferenceException 。 像无操作一样给它一个合理的默认值更方便,这样你就可以直接引发事件而不必使用包装器方法或任何东西。

委托成员的默认值为null ,因此如果不为其分配任何内容,则在尝试调用它时将抛出NullReferenceException 。 您可以轻松地看到这可能是一个问题:想象一下,如果您必须在每个控件上订阅OnKeyDown

很方便,标准库中的事件受到保护 ,这与事情完全相同:

 Event handler = OnClick if (handler != null) handler(this, new EventArgs()); 

这是我建议的forms,对我来说 – 无论如何 – 它看起来更干净。 另外,请注意使用局部变量。 把它写成是合法的

 if(OnClick != null) OnClick(this, new EventArgs()); 

但这不是线程安全的,因为OnClick的监听器可以在null检查和调用之间取消订阅。