オンラインでよく遭遇するコードについて質問があります。例えば
public static event Action<Foo> foo = delegate{ };
宣言の左側を取得しました。しかし、右辺はややこしい。括弧が空のデリゲートにイベントを割り当てるポイントは何ですか?
オンラインでよく遭遇するコードについて質問があります。例えば
public static event Action<Foo> foo = delegate{ };
宣言の左側を取得しました。しかし、右辺はややこしい。括弧が空のデリゲートにイベントを割り当てるポイントは何ですか?
?.
更新: C# の最新バージョンでは、使用する推奨パターンは、null のままにして演算子を使用することです。
event Action<Foo> foo; // leave it as null as the default
// ...
foo?.(new Foo());
古いバージョンの C# では、このパターンの理由は、event
フィールドの既定値がnull
. これには、イベントを発生させるたびに null チェックを使用する必要があります。初期化されていないフィールドを呼び出すfoo()
とevent
、NullReferenceException
. no-op のように適切なデフォルト値を指定する方が便利です。これにより、ラッパー メソッドなどを使用せずに直接イベントを発生させることができます。
デリゲート メンバーの既定値はnull
であるため、何も割り当てないとNullReferenceException
、呼び出そうとすると がスローされます。これがどのように問題になるかは簡単にわかります。すべてのコントロールOnKeyDown
でサブスクライブする必要がある場合を想像してみてください。
便利なことに、標準ライブラリのイベントは Guarded であり、これは同等のことを行います:
Event handler = OnClick
if (handler != null)
handler(this, new EventArgs());
これは、私が推奨する形式です。とにかく、私にとっては、すっきりしているように見えます。また、ローカル変数の使用にも注意してください。のように書くことは合法です。
if(OnClick != null) OnClick(this, new EventArgs());
ただし、これはスレッドセーフではありません。OnClick のリスナーは、null チェックと呼び出しの間でサブスクライブを解除できるからです。