17

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

ハンドラーにオブジェクトと変更されたプロパティを渡すと、それらはどうなりますか?

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

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

これを使用してこのコードを取得したと思いますが、それが何をしているのかを完全に理解したいと思います。

4

3 に答える 3

38

あなたがちょうどした場合:

PropertyChanged(this, new PropertyChangedEventArgs(name))

NullReferenceException誰もイベントにサブスクライブしていない場合は、 を取得しますPropertyChanged。これに対抗するには、null チェックを追加します。

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

ここで、マルチスレッドを使用している場合、null チェックとイベントの呼び出しの間に誰かがサブスクライブを解除できるため、 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));
  }
于 2013-07-19T01:21:24.733 に答える
9

PropertyChangedインターフェイスでの定義に従って、次のように宣言されたイベントです。

public event PropertyChangedEventHandler PropertyChanged;

そのように定義されたイベントは、実際には、サブスクライブしてデリゲート (関数への参照) を追加したり、サブスクライブ解除してデリゲートを削除したりできるイベント ハンドラーのリストの構文糖衣です。

ここで、イベントを呼び出すと、つまりPropertyChanged(...)、内部的に何が起こるかというと、その内部リスト内のすべてのデリゲートがパラメーターを使用して個別に呼び出されます。これにより、イベントのすべてのサブスクライバーに、イベントが発生したことが通知されます。

handlerここで、変数を使用する理由は、 PropertyChangednull になる可能性があるためです。何もサブスクライブしていない場合、イベント (またはイベント ハンドラー リスト) の呼び出しは機能しないため、これはハンドラーを実際に実行できるようにするための方法にすぎません。

于 2013-07-19T01:19:35.683 に答える
6

handlerハンドラーがイベントにサブスクライブされていない場合は null になる可能性があります。4行目は、指定されたプロパティ名のイベントを発生させます (サブスクライブされたすべてのハンドラーを実行します)。

PropertyChanged通常、WPF フレームワークはバインディングを使用するときにサブスクライブするため、バインドされたプロパティが変更されるとバインディングを更新できます。

于 2013-07-19T01:12:42.283 に答える