分配给空委托的事件声明

时间:2013-03-03 22:50:09

标签: c#

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

  public static event Action<Foo> foo = delegate{  };

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

2 个答案:

答案 0 :(得分:7)

更新:在现代版本的C#中,建议使用的模式是将其保留为null并使用?.运算符:

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

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

答案 1 :(得分:4)

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

很方便,标准库中的事件是保护的,它做了同样的事情:

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

这是我建议的形式,对我来说 - 无论如何 - 它看起来更干净。另外,请注意使用局部变量。将其写为

是合法的
if(OnClick != null) OnClick(this, new EventArgs()); 

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