Frage

Könnte jemand die Bedeutung des folgenden Teils des Codes erklären:

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

Dank

War es hilfreich?

Lösung

add { } ist ein Konstrukt ähnlich wie get { } Objekte, mit Ausnahme Add Arbeiten auf Veranstaltungen. Sie definieren hier benutzerdefinierte Funktionen als Teilnehmer zu einem Ereignis hinzufügen.

In diesem Fall ist dieses Verfahren Körper verhindert konsekutiven Duplikaten (d.h. man kann die gleiche Methode / handler zweimal nicht registrieren in einer Reihe ).

So in diesem Beispiel:

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

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

Später:

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

Die Methode HandleUserChanged wird nur einmal ausgelöst, auch wenn Sie es zweimal registriert. Ein normales Ereignis (ohne add { }) würde die doppelte Funktion aufrufen.

Allerdings:

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

Wird HandleUserChanged Feuer erlauben zweimal, weil die zuletzt registrierten Handler nicht immer derjenige hinzugefügt wird, ist. Der Operator == auf Ereignisse arbeitet auf dem LAST-Handler. (Vielen Dank an Matthew dafür, um die Aufmerksamkeit zu bringen)

Andere Tipps

Es kommt mir seltsam, dass m_UserChanged als Ereignis eher deklariert ist als nur eine Delegate-Instanz (ist das die richtige Terminologie ... ich w / Delegierten verwechselt werden). Ereignisse sind analog zu einem einfachen Objektmodell, dass sie im Wesentlichen darunter liegende Felder in einem Paar von transparenten Methoden wickelt.

So wie ich es verstehe, .Net ermöglicht die Erstellung von implcit (anonym?) Veranstaltung und Eigenschaften von so etwas wie dies unter:

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

und dann die jeweils zugrunde liegenden Platzhalter Erstellen von Objekten etwas mehr wie folgt zu generieren:

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;}}

Das zugrunde liegende Objekt kann explizit natürlich definiert werden, aber was ist das Codebeispiel oben sieht aus wie ein bisschen eine Verschmelzung zwischen expliziten und impliziten Ereignisdeklaration ... es sieht aus wie die folgende tatsächlich getan wird (hinter den Kulissen, wie sie waren):

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; 
      } 
  } 
} 

Es ist nicht wirklich wichtig in dem großen Plan der Dinge, ich weiß nicht erraten, aber es sieht aus wie ein Versehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top