3

(回避するために) スレッドセーフな方法でイベントを発生させるには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);

これは、決定的な方法でイベントを発生させる適切な方法に関する混乱を解決するusingand async/に沿った構文上の利便性です。await

欠点は何ですか?

編集

フィードバックをお寄せいただきありがとうございます。別のキーワードを追加することは、確かに少し極端です。

ただし、イベントを発生させる「標準的な」方法はまだ不足しており、多くの人がRaise()拡張メソッドを気に入っているためmscorlibVisual Studio UserVoice チャネルに追加することを提案しました。

4

1 に答える 1

2

それは本当にエラーが発生しやすいですか、それとも混乱しますか?彼らがそのようなキーワードを追加したとしても、互換性のためにイベントを発生させる古い方法を維持する必要があり、イベントを発生させる正しい方法を知っている必要があります。次のような拡張メソッドを作成して、ほとんどの作業を行うことができます。

public static void Raise(this EventHandler handler, object sender, EventArgs args)
{
  if (handler != null)
  {
    handler(sender, args); 
  }
}

コードベースを数行減らすよりも、コンパイラチームが不可能を可能にするために取り組んでほしいと思います。

于 2013-03-23T21:24:46.640 に答える