6

記事http://msdn.microsoft.com/en-us/magazine/dd419663.aspxには、次のコード サンプルがあります。

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{       
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(this, e);
    }
}

私の質問は、変数「ハンドラー」を導入することで得られるものです-次のコードは正常に機能するようです:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{   
    if (PropertyChanged!= null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        PropertyChanged(this, e);
    }
}
4

3 に答える 3

5

ローカル変数の背後にある理由は、マルチスレッド環境では、null のチェックとイベントの起動の間のギャップで、イベントがサブスクライバーを欠いている (つまり、null になる) 可能性があるためです。

ローカル変数を使用することで、この潜在的な問題を回避し、スレッドセーフな方法でイベントをチェックします。以前にアンフックされたアイテムに対してイベントがスローされる可能性があるという問題が発生します。

于 2010-12-20T13:09:05.220 に答える
1

これはスレッドセーフのために行われます。2 番目の例では、if ブロック中に PropertyChanged の呼び出しリストが null になり、例外が発生する可能性があります。

于 2010-12-20T13:09:09.820 に答える
0

これは、OnPropertyChanged メソッドがスレッド セーフであることを確認するためです。別の説明については、イベント ハンドラーでの null チェックの使用を参照してください。

于 2010-12-20T13:10:32.317 に答える