2

誰かがコードの次の部分の意味を説明できますか:

private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
  add
  {
      if (m_UserChanged != value)
      {
        m_UserChanged += value;
      }
  }
}

ありがとう

4

2 に答える 2

4

add { }get { }add はイベントで機能することを除いて、プロパティの場合とよく似た構造です。イベントにデリゲートを追加するときに、ここでカスタム機能を定義しています。

この場合、このメソッド本体は連続した重複を防ぎます (つまり、同じメソッド/ハンドラーを続けて2 回登録することはできません)。

したがって、この例では:

public void HandlerUserChanged(object o, UserChangedEventArgs args)
{
     // some code
}

public void HandlerUserChanged2(object o, UserChangedEventArgs args)
{
     // some code
}

後で:

UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());

メソッドHandleUserChangedを 2 回登録した場合でも、メソッドは 1 回だけ起動します。通常のイベント ( なしadd { }) では、関数が 2 回呼び出されます。

でも:

UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged2;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());

HandleUserChanged最後に登録されたハンドラーが追加されることはないため、2 回起動することができます。イベントの == 演算子は、LAST ハンドラーで機能します。(注意を喚起してくれたマシューに感謝します)

于 2010-09-28T15:51:30.403 に答える
0

m_UserChanged が単なるデリゲート インスタンスではなくイベントとして宣言されているのは奇妙に思えます (正しい用語です...デリゲートと混同されます)。イベントは、基本的に透過的なメソッドのペア内で基礎となるフィールドをラップするという点で、単純な Property モデルに似ています。

私が理解している方法では、.Net では、次のようなものを使用して、暗黙的な (匿名?) イベントとプロパティを作成できます。

public int Value { get; set;}
public event EventHandler ValueChanged;

次に、それぞれの基礎となるプレースホルダー オブジェクトを作成して、次のようなものを生成します。

private int _Value;
public int Value { get { return _Value;} set { _Value = value;}}

private EventHandler _ValueChanged;
public event EventHandler ValueChange { add { _ValueChanged += value;} remove { _ValueChanged -= value;}}

基礎となるオブジェクトはもちろん明示的に定義できますが、上記のコード サンプルは、明示的なイベント宣言と暗黙的なイベント宣言の間の少しの混同のように見えます...次のことが実際に行われているように見えます (いわば舞台裏で) ):

private UserChangedHandler _m_UserChanged; 
private event UserChangedHandler m_UserChanged { add { _m_UserChanged += value;} remove { _m_UserChanged -= value;}}
public event UserChangedHandler UserChanged 
{ 
  add 
  { 
      if (m_UserChanged != value) 
      { 
        m_UserChanged += value; 
      } 
  } 
} 

大局的には大した問題ではないと思いますが、見落としのようです。

于 2010-09-28T18:15:19.570 に答える