2013-07-19 5 views
14

これは本当に簡単な質問ですが、誰かが4行目が実際に何をしているのか説明できるかどうか疑問に思っていましたか?最初の行はハンドラにイベントを与えます。どの状況でハンドラがnullを返すか、最後の行が何を返すかはわかりません。PropertyChangedEventHandlerはどのように機能しますか?

ハンドラにオブジェクトを渡し、どのプロパティが変更されたときに、それらのオブジェクトとは何をしますか?

PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event 

if (handler != null) 
{ 
    handler(this, new PropertyChangedEventArgs(name)); 
} 

私はこのcodeを取得するためにこれを使用するが、私はそれが十分にやっているかを理解したいと仮定します。

+0

文脈がなければ、わかりにくいです。どのフレームワークを使用していますか?これはBCLの一部ではなく、おそらくあなたが調べて使用しているMVVMフレームワークの一部です。 – Will

+0

これは 'PropertyChangedEventHandler'にとって特別なものではありません。それはハンドラーの仕組みです。 –

+0

ウィルのコメントは無意味です。これはタグ付きWPFです。 PropertyChangedEventHandlerはSystem.ComponentModelにあります。 MVVMフレームワークのようなものはありません.MVVMは、WPFには便利ですが必須ではないアーキテクチャパターンです。とにかく、この質問はC#でイベントハンドラがどのように動作するかについてのもので、その答えは特定のイベントやフレームワークに固有のものではありません。 –

答えて

35

あなただけやった場合:

PropertyChanged(this, new PropertyChangedEventArgs(name)) 

誰がイベントPropertyChangedに加入していなかった場合は、NullReferenceExceptionになるだろう。これに対抗するには、NULLチェックを追加します。

if(PropertyChanged != null) 
{ 
    PropertyChanged(this, new PropertyChangedEventArgs(name)) 
} 

さて、あなたはヌルチェックとイベントの呼び出しの間で退会できマルチスレッド誰かを使用している場合、あなたはまだNullReferenceExceptionを得ることができるようにします。我々は一時変数

PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
    handler(this, new PropertyChangedEventArgs(name)); 
    } 

にイベントハンドラをコピーすることを処理するために、誰かがイベントからスクライブ解除場合は今私達の一時的な変数handlerはまだ古い機能を指すことになると、このコードは今NullReferenceExceptionを投げる方法がありません。

多くの場合、人々はキーワードvarを代わりに使用します。これにより、一時変数の完全な型を入力する必要がなくなります。これは、コードで最もよく表示されるフォームです。

var handler = PropertyChanged; 
    if (handler != null) 
    { 
    handler(this, new PropertyChangedEventArgs(name)); 
    } 
+0

競合状態では、ハンドラをコピーせずに、今指定した人が呼び出されなくなる関数を呼び出しますか?それは単にビジネスの受け入れられた方法ですか、私が行方不明のものがありますか? –

+1

@ZachMierzejewskiはい、これは予想される動作です。加入者は、マルチスレッド状態でも未登録であっても、メソッドへの最終呼び出しを得ることができることを知っておく必要があります。 .NETに組み込まれたすべてのクラスのイベントは、このパターンで動作します。 –

6
handler subscribedから eventへのハンドラがない場合、4行目は指定されたプロパティ名(すべてのサブスクライブされたハンドラを実行する)のイベントを発生させます。

通常、バインディングを使用するとWPFフレームワークはPropertyChangedに登録されるため、バインドされたプロパティが変更されるとバインディングを更新できます。そのように定義されてい

public event PropertyChangedEventHandler PropertyChanged; 

Eventsが実際にあなたが追加することができるイベントハンドラのリストについては、シンタックスシュガーです:

7

PropertyChanged

は、インタフェースでの定義に従って、このように宣言されたイベントでありますサブスクリプションによってデリゲートを削除する(関数への参照)。

イベントを呼び出すとき、つまりPropertyChanged(...)が内部で発生するのは、その内部リストのすべてのデリゲートがパラメータで個別に呼び出されるということです。これにより、イベントのすべての加入者にイベントが発生したことが通知されます。

ここで、handler変数を使用する理由は、PropertyChangedはnullになる可能性があるためです。何も購読していなければ、イベント(またはイベントハンドラリスト)を呼び出すことはできません。実際にハンドラを実際に実行できるかどうかを確認する方法です。

関連する問題