(回避するために) スレッドセーフな方法でイベントを発生させるにはNullReferenceException
、呼び出す前にイベント デリゲートをコピーする必要があります。
EventHandler copy = TheEvent;
if (copy != null)
copy(this, EventArgs.Empty);
または、Jon Skeet によって提案されたVolatile.Read
ように、C# 6 でnull 条件演算子を使用します。
Volatile.Read(ref TheEvent)?.Invoke(this, EventArgs.Empty);
(議論については、 C# イベントとスレッド セーフを参照してください)。
これは面倒でエラーが発生しやすい作業です。raise
上記のパターン (または C# コンパイラ チームによって選択された改善されたパターン) がコンパイラによって透過的に処理されるように、C# にキーワードを追加することは意味がありません。
raise TheEvent(this, EventArgs.Empty);
これは、決定的な方法でイベントを発生させる適切な方法に関する混乱を解決するusing
and async
/に沿った構文上の利便性です。await
欠点は何ですか?
編集
フィードバックをお寄せいただきありがとうございます。別のキーワードを追加することは、確かに少し極端です。
ただし、イベントを発生させる「標準的な」方法はまだ不足しており、多くの人がRaise()
拡張メソッドを気に入っているためmscorlib
、Visual Studio UserVoice チャネルに追加することを提案しました。