事件声明并将其分配给空委托

4

我有一个关于某段常常出现在网上的代码的问题。例如:

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

我理解了声明的左侧,但是右侧让我感到困惑。将事件指定给一个空括号的委托有什么意义呢?

2个回答

7

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

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

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


4
委托成员的默认值是 null,因此如果您没有为其分配任何内容,则在尝试调用它时会抛出 NullReferenceException。您可以轻松看出这可能是一个问题:想象一下如果您必须订阅每个控件上的 OnKeyDown 事件!
方便的是,标准库中的事件是保护的,这样做相当于同样的事情:
Event handler = OnClick
if (handler != null)
    handler(this, new EventArgs());

这是我推荐的表格,因为在我看来更干净。此外,请注意使用局部变量。可以将其编写为:
if(OnClick != null) OnClick(this, new EventArgs()); 

但这并不是线程安全的,因为在进行空值检查和调用之间,OnClick侦听器可能会取消订阅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接