2010-12-16 25 views
5

私は誰かが私に説明できVARハンドラの必要性が=前直接==にPropertyChangedヌルをチェック対ヌルのためにそれをチェックする割り当てをにPropertyChanged INotifyPropertyChangedのINotifyPropertyChangedを実装するためのパターン?

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

public event PropertyChangedEventHandler PropertyChanged; 

を実装するために使用される次のパターンを見てきました直接?マルチスレッドの世界では

+0

[C#ではイベントを発生させるたびにヌルチェックを書く必要があるのはなぜですか?](http://stackoverflow.com/questions/3102918/why-does-c-require-you-to-write-a-null-check-every-time-you-fire-an-event) – decyclone

+0

@decycloneこれは詐欺ではありません... OPは、ハンドラがnullであるかどうかを確認する理由を尋ねるのではなく、ハンドラのローカルコピーを使用する必要がある理由を尋ねません。 –

+0

このパターンはVB.NETには必要ですか?または、RaiseEventがこれを処理しますか? – MCattle

答えて

4

エリック・リッパートは、このブログの記事で詳細を説明しています:Events and races

基本的には、PropertyChanged != nullをチェックした後、実際にPropertyChangedを呼び出す前に、別のスレッドがこのイベントの最後のハンドラを登録解除する場合の競合状態を避けることです。ハンドラのローカルコピーを作成した場合、これは起こりません(ただし、登録解除されたばかりのハンドラを呼び出すことになる可能性があります)

+0

サブスクライブしていない(イベントソースがこのレースを避けることができない場合でも、すべての同時実行性を排除しない限り)サブイベントの直後に呼び出されるケースを処理するのはサブスクライバの責任です。 – Richard

0

おかげで、のPropertyChanged文が評価された場合は後にnullに設定することができます。

1

イベントを発生させるスレッドセーフな方法です。パブリックにアクセス可能なPropertyChangedイベントを使用する前にローカルに割り当てることで、 'if'ステートメントと実際にイベントを発生させる行との間で違いがないことを保証します。

関連する問題