マイクロソフトプラクティステストでこの質問に出くわし、混乱しました。ここに質問があります:
次の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番目の方法を使用する理由を教えてもらえますか?
マルチスレッド環境では、イベントがディスパッチされている間にイベントハンドラーが更新される可能性があります。このシナリオを回避するには、nullを確認してメッセージをディスパッチする前に、ハンドラーをローカル変数に割り当てます。