2014-02-25 11 views
5

Ich habe die meisten Menschen gesehen verwenden Membervariablen in einer Klasse wie:Warum Variablen Verwendung Mitglied in einer Klasse

string _foo; 
public string foo { get { return _foo; }; private set { _foo = value}; } 

Aber was ist der Unterschied von, dass zu diesem?

public string foo { get; private set; } 
+1

Siehe hier: http://stackoverflow.com/questions/168169/public-variables-vs-private-variables-with-accessors?rq=1 – mattytommo

+1

Nicht wirklich ein Duplikat. Die andere Frage stellt die Frage, warum Eigenschaften überhaupt verwendet werden, während diese nur fragt, warum jemand manuelle Eigenschaften anstelle von automatischen Eigenschaften implementiert. – Luaan

+0

@Luaan: War gerade dabei, diesen Punkt selbst zu machen. Dies ist ein explizites Backign-Feld gegenüber einem impliziten Backing-Feld anstelle der Verwendung von Eigenschaften zum Umhüllen privater Felder. – Chris

Antwort

4

In einfachen Fällen wie diesem ist es das gleiche, aber in komplexeren Fällen, in denen Sie Ereignisse oder etwas feuern Sie in der get zusätzlichen Code benötigen und so eingestellt, müssen Sie das Mitglied ab:

private string _name; 
public string Name 
{ 
    get{ return _name; } 
    set 
    { 
     SomeHandler("Name", value); 
     _name = value; 
    } 
} 
+0

Aber mit meinem zweiten Beispiel können Sie auch Ereignisse vom Set-Accessor auslösen. Ist es nicht genauso? – CudoX

+0

Nein, denn wenn Sie Code eingeben, verlieren Sie die automatische Eigenschaft, die Sie nicht setzen können {SomeHandler ("Name", Wert); } Es wird den Wert nicht auf die Eigenschaft festlegen. –

3

Wie Solange die Property-Implementation eigentlich nichts anderes tut als setzen und setzen, ist der Unterschied ziemlich gering. Die Gründe für die Verwendung das auch sein mag:

  • Legacy-Code vor C# 3.0 (die Auto-Eigenschaften hinzugefügt, dh die public string Name { get; set; } Syntax
  • Erwartung der Umsetzung der Getter/Setter an einem gewissen Punkt ändern zu müssen.. .
  • Anforderungen für einige benutzerdefinierte Serialisierung.
  • das darunter liegende Feld aus irgendeinem Grunde in Code. ein gutes Beispiel dafür könnte das dahinter liegendes Feld als ref Parameter zu einem gewissen Verfahren wird. Dazu gehört auch Dinge wie der Wert in nativen mit Interop (GCHandle etc.).
  • Einfache Benutzereinstellung. Normalerweise verwende ich keine Auto-Eigenschaften, da ich die Backing-Felder gerne manuell spezifiziere.
  • Die Verwendung eines readonly Hintergrundfelds ist bei Verwendung von Auto-Eigenschaften nicht möglich.

Dies ist nur die Spitze des Eisbergs. Es gibt auch Tonnen von seltsamen Gründen, sagen wir, dass wir das Feld explizit deklarieren müssen, so dass jemand aus irgendwelchen Gründen mit Reflektion darauf zugreifen kann.

1

Vor der Einführung von "Automatische Eigenschaften" müssen wir ein "Backing Field" für die Propoerties verwenden. Meistens geben die Propoerties einfach den Wert zurück und setzen den Wert auf das "backing field" wie im folgenden Beispiel.

public string Name 
{ 
    get { return _name; } 
    set { _name=value; } 
} 

Mit der Einführung von ‚Automatische Eigenschaften‘ wir können das ‚dahinter liegendes Feld‘ einfach ignorieren (oder wir brauchen nicht ein zu liefern). Dies ist am besten geeignet, wenn Ihr Design dem obigen Beispiel entspricht, aber wenn Sie eine Art von benutzerdefinierter Logik erzwingen müssen, während Sie den Wert abrufen oder bevor Sie den Wert festlegen, müssen wir dem "guten alten Design" folgen das Hintergrundfeld)

0

Unterschiedliches Szenario gibt verschiedene Vorteile.

string _FirsName; 
string _LastName; 

public string FullName 
{ 
    get 
    { 
     return _FirsName + _LastName; 
    } 
    set; 
} 

public string ReverseName 
{ 
    get 
    { 
     return _LastName + ", " + _FirsName; 
    } 
    set; 
} 
+1

Was macht das 'set;' in diesen Beispielen? Hmmm ... nachdem das Testen fehlschlägt, scheint das die Antwort zu sein ... (siehe auch das ';' nach dem Getter-Block. – Chris