3

多くの開発者が呼び出したいときに、直接呼び出すのではなく、Eventという名前のローカル変数に割り当てて呼び出すのを見てきました。イベントを直接呼び出さないのはなぜですか?handlerhandlerEvent

private void OnSomethingChanged(EventArgs e)
{
    if (SomethingEvent != null)
    {
        SomethingEvent(this, e);
    }
}
4

3 に答える 3

5

あなたが投稿したコードは、基本的にスレッドセーフではありません。チェック、呼び出し前に、最終サブスクライバーが別のスレッドでサブスクライブを解除すると、が取得されます。ifNullReferenceException

1つのオプションは、拡張メソッドを作成することです。

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

次に、次のように書くことができます。

private void OnSomethingChanged(EventArgs e)
{
    SomethingEvent.NullSafeInvoke(this, e);
}

おそらくEventHandler<T>、別のオーバーロードも必要になるでしょう。

于 2012-07-30T21:12:28.657 に答える
4

イベントがコピーされない場合、競合状態になる可能性があります(マルチスレッドアプリケーションのみに関連)。

nullチェックの直後に1つのスレッドがイベントのサブスクライブを解除し、サブスクライブされていないスレッドがある場合は、が取得されますNullReferenceException

于 2012-07-30T21:12:33.523 に答える