微软关于事件的教程展示了如何在触发之前检查它event
:null
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
{ // Potential Race-condition at this point!
Changed(this, e);
}
}
但这留下了一个竞争条件,正如Eric Lippert 的博客中所详述的那样,他在其中写道,应该通过本地事件触发事件以避免竞争条件:
protected virtual void OnChanged(EventArgs e)
{
ChangedEventHandler temp = Changed; // Local copy of the EventHandler
if (temp != null)
{ // Race condition avoided by local variable.
temp(this, e);
}
}
虽然这可行,但它让许多开发人员感到困惑,他们弄错了,并且没有将其放入本地范围的事件中。
DailyCoding的另一种解决方案是始终将您的事件初始化为有一个空处理程序,因此永远不需要空检查:
// Set with empty delegate, will never be null
public event ChangedEventHandler Changed = delegate { };
protected virtual void OnChanged(EventArgs e)
{
// Neither Null-check nor local variable is needed; just trigger the event.
Changed(this, e);
}
这个很有道理,也很简单。
但是,由于我在网上看到这种技术很少提及,我认为这一定是有原因的。
用这样的空委托初始化事件有缺点吗?