2011-10-27 8 views
4

私はINotifyPropertyChangedからNotifyPropertyChanged()を見ていると、そのようなここにマイクロソフトからの例であることに気づいています:それは例えばここにやって言うようNotifyPropertyChangedスレッドセーフですか?

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

デリゲート参照のないキャプチャは(最初はありません。Use of null check in event handler

私は自分のServiceReferencesのために自動生成されたReference.csを見て、このチェックが完了しました。

私の質問は、私がこれを行うべきかどうかです(拡張メソッドなどのような形式で)?私はしない場合、可能性のある問題はありますか?

答えて

7

あなたが正しいです、チェックが完了し、その例が間違っています。

以下は標準コードです。

private void NotifyPropertyChanged(String propertyName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler (this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

編集:さらにこれが必要な理由についての説明(と、なぜそれが動作します)

MSの例では、彼らはのPropertyChangedに直接ヌルチェックを行うと、それを呼び出します。したがって、nullチェックと呼び出しの間でPropertyChangedがnullになる可能性があります。デリゲートをローカル変数に代入することによって、デリゲートへの参照が保持され、ヌルチェックと呼び出しの間で変更することはできません。

+0

私が見たMicrosoftの例は、それほど優れていないようです。応答のためにありがとう – Firedragon

+0

彼らはまさにMSの例でそれをする...私は盲目ですか? – fixagon

+0

@fantasticfix PropertyChangedはローカル変数に最初にコピーする必要があります – Simon

関連する問題