4

私は他の人のコードでイベントを呼び出すこのパターンを見続けています:

void OnMyEvent()
{
  var myEvent = MyEvent;

  if (myEvent != null)
    myEvent(this, EventArgs.Empty);
}

MyEvent直接使用するのではなく、イベントを参照するために変数を使用する利点は何MyEvent(this, EventArgs.Empty)ですか?

4

1 に答える 1

8

マルチスレッドアプリケーションでは、このメソッドの呼び出しの途中でイベントのサブスクライブが解除される場合があります。

これにより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 
  }
}
于 2012-09-14T08:45:07.383 に答える