私は他の人のコードでイベントを呼び出すこのパターンを見続けています:
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
}
}