我一直在其他人的代码中看到这种调用事件的模式:
void OnMyEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, EventArgs.Empty);
}
使用变量来引用事件MyEvent
而不是直接使用有什么好处MyEvent(this, EventArgs.Empty)
?
我一直在其他人的代码中看到这种调用事件的模式:
void OnMyEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, EventArgs.Empty);
}
使用变量来引用事件MyEvent
而不是直接使用有什么好处MyEvent(this, EventArgs.Empty)
?
在多线程应用程序中,事件可能会在调用此方法的过程中取消订阅。
NullReferenceException
如果未以这种方式复制事件处理程序,这可能会导致错误。
void OnMyEvent()
{
if (MyEvent!= null) // Thread A checks event
{ // Thread B unsubscribes _last_ handler
MyEvent(this, EventArgs.Empty); // Boom!
}
}
但是有:
void OnMyEvent()
{
var myEvent = MyEvent; // Thread A gets _copy_ of invocation list
if (myEvent != null) // Using copy, so no problem
{ // Thread B unsubscribes _last_ handler
myEvent(this, EventArgs.Empty); // Still using copy, so no problem
}
}