web-dev-qa-db-ja.com

C#でイベントを発生させる

マイクロソフトプラクティステストでこの質問に出くわし、混乱しました。ここに質問があります:

次のC#コードサンプルのどれが、Alarmイベント、AlarmEventArgsクラス、およびAlarmEventHandlerデリゲートが宣言されていると想定して、イベントを発生させる適切な方法ですか?

彼らが提供した「正しい」答えは次のとおりです。

AlarmEventArgs e = new AlarmEventArgs(1, 2);
AlarmEventHandler handler = Alarm; 
if (handler != null) 
{ 
    handler(this, e);
}

しかし、正しいと思われる別の答えもあります。

AlarmEventArgs e = new AlarmEventArgs(1, 2);
if (Alarm!= null) 
{ 
    Alarm (this, e);
}

私個人的には、常に2番目の方法を使用します。正常に動作します。誰かが2番目ではなく1番目の方法を使用する理由を教えてもらえますか?

20
Long Ngo

マルチスレッド環境では、イベントがディスパッチされている間にイベントハンドラーが更新される可能性があります。このシナリオを回避するには、nullを確認してメッ​​セージをディスパッチする前に、ハンドラーをローカル変数に割り当てます。

7
jeremyalan