基本上,我已经看到这经常使用:
public event MyEventHandler MyEvent;
private void SomeFunction()
{
MyEventHandler handler = this.MyEvent;
if (handler != null)
{
handler(this, new MyEventArgs());
}
}
当它可以像这样轻松地完成时:
public event MyEventHandler MyEvent;
private void SomeFunction()
{
if (MyEvent != null)
{
MyEvent(this, new MyEventArgs());
}
}
那么,我错过了什么吗?是否有人将事件分配给处理程序,然后引发处理程序而不是事件本身?这只是“最佳实践”吗?
答案 0 :(得分:11)
对局部变量的赋值可确保如果事件在if
和实际调用之间取消注册,则调用列表将不为空(因为该变量将具有副本原始调用列表)。
这在多线程代码中很容易发生,在检查null和触发事件之间,它可能会被另一个线程取消注册。
请参阅this SO问题和答案。
答案 1 :(得分:2)
线程安全。
如果在您检查MyEvent是否为空并且触发MyEvent之间,另一个线程出现并取消订阅该事件会发生什么?