我有一个关于某段常常出现在网上的代码的问题。例如:
public static event Action<Foo> foo = delegate{ };
我理解了声明的左侧,但是右侧让我感到困惑。将事件指定给一个空括号的委托有什么意义呢?
我有一个关于某段常常出现在网上的代码的问题。例如:
public static event Action<Foo> foo = delegate{ };
我理解了声明的左侧,但是右侧让我感到困惑。将事件指定给一个空括号的委托有什么意义呢?
更新:在现代版本的C#中,建议使用将其保留为null并使用?.
运算符的模式:
event Action<Foo> foo; // leave it as null as the default
// ...
foo?.(new Foo());
在旧版的 C# 中,采用这种模式的原因可能是 event
字段的默认值为 null
。这需要每次想要触发事件时使用 null 检查 - 在未初始化的 event
字段上调用 foo()
会导致 NullReferenceException
。更方便的方法是给它一个合理的默认值,比如一个空操作,这样你就可以直接触发事件而不必使用包装方法或其他东西。
null
,因此如果您没有为其分配任何内容,则在尝试调用它时会抛出 NullReferenceException
。您可以轻松看出这可能是一个问题:想象一下如果您必须订阅每个控件上的 OnKeyDown
事件!Event handler = OnClick
if (handler != null)
handler(this, new EventArgs());
if(OnClick != null) OnClick(this, new EventArgs());
但这并不是线程安全的,因为在进行空值检查和调用之间,OnClick侦听器可能会取消订阅。