4

オンラインでよく遭遇するコードについて質問があります。例えば

  public static event Action<Foo> foo = delegate{  };

宣言の左側を取得しました。しかし、右辺はややこしい。括弧が空のデリゲートにイベントを割り当てるポイントは何ですか?

4

2 に答える 2

7

?.更新: C# の最新バージョンでは、使用する推奨パターンは、null のままにして演算子を使用することです。

event Action<Foo> foo; // leave it as null as the default
// ...
foo?.(new Foo());

古いバージョンの C# では、このパターンの理由は、eventフィールドの既定値がnull. これには、イベントを発生させるたびに null チェックを使用する必要があります。初期化されていないフィールドを呼び出すfoo()eventNullReferenceException. no-op のように適切なデフォルト値を指定する方が便利です。これにより、ラッパー メソッドなどを使用せずに直接イベントを発生させることができます。

于 2013-03-03T22:52:41.333 に答える
4

デリゲート メンバーの既定値はnullであるため、何も割り当てないとNullReferenceException、呼び出そうとすると がスローされます。これがどのように問題になるかは簡単にわかります。すべてのコントロールOnKeyDownでサブスクライブする必要がある場合を想像してみてください。

便利なことに、標準ライブラリのイベントは Guarded でありこれは同等のことを行います:

Event handler = OnClick
if (handler != null)
    handler(this, new EventArgs());

これは、私が推奨する形式です。とにかく、私にとっては、すっきりしているように見えます。また、ローカル変数の使用にも注意してください。のように書くことは合法です。

if(OnClick != null) OnClick(this, new EventArgs()); 

ただし、これはスレッドセーフではありません。OnClick のリスナーは、null チェックと呼び出しの間でサブスクライブを解除できるからです。

于 2013-03-03T22:59:48.463 に答える