it-swarm.com.de

Soll ich öffentliche Eigenschaften und private Felder oder öffentliche Felder für Daten verwenden?

In einem Großteil des Codes, den ich gesehen habe (auf SO, thecodeproject.com und ich neige dazu, dies in meinem eigenen Code zu tun), habe ich öffentliche Eigenschaften für jedes einzelne private Feld, das eine Klasse enthält, erstellt, auch wenn sie die meisten sind Grundtyp von get; set; wie:

private int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

Meine Frage ist: Wie unterscheidet sich das von:

public int MyInt;

und wenn wir Eigenschaften anstelle von öffentlichen Feldern verwenden sollten, warum sollten wir sie in diesem speziellen Fall verwenden? (Ich spreche nicht von komplexeren Beispielen, bei denen die Getter und Setter tatsächlich etwas Besonderes tun oder es nur ein Get oder Set gibt (nur Lesen/Schreiben), statt nur einen Wert eines privaten Feldes zurückzugeben/zu setzen). Es scheint keine zusätzliche Kapselung hinzuzufügen, es wird nur ein Nice-Symbol in IntelliSense angezeigt und in einem speziellen Abschnitt in Klassendiagrammen platziert!

55
Callum Rogers

Siehe diesen Artikel http://blog.codinghorror.com/properties-vs-public-variables/

Speziell 

  • Reflection funktioniert bei Variablen anders als bei Eigenschaften. Wenn Sie also auf Reflection angewiesen sind, können Sie alle Eigenschaften einfacher verwenden.
  • Sie können keine Datenbindung für eine Variable erstellen.
  • Das Ändern einer Variablen in eine Eigenschaft ist eine grundlegende Änderung. 
33
Johnno Nolan

Drei Gründe:

  1. Sie können Felder in Unterklassen nicht wie Eigenschaften überschreiben.
  2. Sie benötigen eventuell einen komplexeren Getter oder Setter, aber wenn es sich um ein Feld handelt, würde eine Änderung die API beschädigen. 
  3. Konvention. So wird es gemacht.

Ich bin sicher, es gibt mehr Gründe, an die ich gerade nicht denke.

In .Net 3.x können Sie automatische Eigenschaften wie folgt verwenden:

public int Age { get; set; }

anstelle der alten Schulweise mit der Angabe Ihrer privaten Felder wie folgt:

private int age;

public int Age
{
    get { return age; }
    set { age = value; }
}

Dies macht es so einfach wie das Erstellen eines Feldes, jedoch ohne das brechende Änderungsproblem (unter anderem).

21
Max Schmeling

Wenn Sie ein privates Feld name und eine einfache öffentliche Eigenschaft Name erstellen, wird der name Feldwert tatsächlich abgerufen und festgelegt

public string Name
{
   get { return name; }
}

und Sie verwenden diese Eigenschaft überall außerhalb Ihrer Klasse. Eines Tages entscheiden Sie, dass die Eigenschaft Name dieser Klasse tatsächlich auf das Feld lastName verweist (oder dass Sie eine Zeichenfolge "My name:" zurückgeben möchten. + name), ändern Sie einfach den Code in der Eigenschaft:

public string Name
{
   get { return lastName; //return "My name: "+name; }
}

Wenn Sie das öffentliche Feld name überall im externen Code verwenden, müssen Sie name in lastName überall dort ändern, wo Sie es verwendet haben.

8
agnieszka

Nun, es macht einen Unterschied. Öffentliche Daten können geändert werden, ohne dass die Objektinstanz davon Kenntnis hat. Bei Verwendung von Gettern und Setters weiß das Objekt immer, dass eine Änderung vorgenommen wurde.

Denken Sie daran, dass das Einkapseln der Daten nur der erste Schritt in Richtung eines besser strukturierten Designs ist. Es ist kein Endziel an sich.

5

Sie müssen Eigenschaften in den folgenden Fällen verwenden:

  1. Wenn Sie Daten in der Eigenschaft zu einem bestimmten Format serialisieren müssen.
  2. Wenn Sie Eigenschaften in abgeleiteten Klassen überschreiben müssen.
  3. Wenn Sie Get- und Set-Methoden mit etwas Logik implementieren. Zum Beispiel, wenn Sie das Singleton-Muster implementieren.
  4. Wenn Sie von der Schnittstelle abgeleitet sind, in der die Eigenschaft deklariert wurde.
  5. Wenn Sie spezifische Probleme mit Reflektion haben.
4

Es hängt davon ab, ob?

Ich verwende immer Getter & Setter, da diese Verknüpfung erstellt wurde:

public int Foo {get; einstellen; }

Zur Kompilierzeit wird es übersetzt. Jetzt können Sie nichts Besonderes damit machen, aber es ist da, und wenn Sie Lust haben wollen, dann schreiben Sie es einfach später aus.

Unabhängig davon, ob Sie öffentlich, privat oder geschützt sind - es ist alles eine Frage, wer Sie in der Lage sein möchten, die Daten zu optimieren. Wir verwenden häufig Vererbung, und dies ist eine sehr verbreitete Methode für uns, so dass nur Kinder bestimmte Eigenschaften bearbeiten können.

protected _foo;  
public Foo  
{  
    get { return _foo; }
} //lack of set intentional.
2
Russell Steen

In einfacheren Worten ist die Antwort auf Ihre Frage die Zugriffsmodifizierung, d. H. Öffentlich und privat.

Wenn du benutzt:

public int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

dann stehen sowohl die MyInt-Eigenschaft als auch die MyInt-Variable im Projekt zur Bearbeitung zur Verfügung . Bedeutet, wenn Ihre Klasse angenommen wird, dass A von der Klasse B, .__ Angenommen . Angenommen, Sie möchten, dass der myInt-Wert in der abgeleiteten Klasse festgelegt werden kann, wenn eine bestimmte Bedingung erfüllt ist.

Dies kann nur erreicht werden, indem das Feld privat und die Eigenschaft öffentlich gemacht wird. Damit nur die Eigenschaft verfügbar ist und Bedingungen darauf festgelegt werden können.

0
KamalDeep

Dafür gibt es viele Gründe.

Hauptsächlich:

  • Sie können einige andere Funktionen ausführen, wenn die Variable festgelegt ist
  • Sie können die Einstellung verhindern und nur erhalten
  • Einige Dinge funktionieren nur bei Eigenschaften (z. B. DataBinding)
  • Sie können die Implementierung der Eigenschaft ausblenden (möglicherweise handelt es sich um eine ViewState-Variable in ASP.NET).
0
Noon Silk

Der Punkt ist - was ist, wenn Sie im weiteren Verlauf der Zeile sicherstellen möchten, dass jedes Mal, wenn auf myInt verwiesen wird, etwas Besonderes passiert (in eine Protokolldatei geschrieben, in 42 geändert wird usw.)? Ohne Getter und Setter geht das nicht. Manchmal ist es ratsam, auf das zu programmieren, was Sie brauchen, nicht das, was Sie gerade brauchen.

0
Dominic Rodger

Wenn Sie Silverlight verwenden, werden Sie tatsächlich feststellen, dass Felder nicht als statische Ressourcen festgelegt werden können. Daher müssen Sie eine Eigenschaft verwenden (sogar für den Zugriff auf eine const).

Ich habe erkannt, dass ich versucht habe, die Regionsnamen zusammenzufassen, die ich in Composite Guidance (PRISM) verwende.

Das ist jedoch nur eine Sprachbeschränkung, und abgesehen von static/const-Feldern verwende ich auch Eigenschaften.

0
R4cOON

Die Idee ist, dass Sie den Wert eines privaten Felds der Klasse außerhalb von nicht unbeabsichtigt ändern sollten. Wenn Sie get und set verwenden, bedeutet dies, dass Sie das private Feld der Klasse absichtlich und wissentlich ändern.

0
rayimag

Wenn Sie einen Wert in ein privates Feld setzen, wird nur dieses Feld geändert. Wenn Sie diese Werte jedoch in der Eigenschaft angeben, können Sie andere Argumente verwenden. Sie können beispielsweise eine Methode aufrufen, nachdem Sie einen Wert festgelegt haben

 private Zeichenfolge _email; 
 öffentliche Zeichenfolge E-Mail 
 {
 erhalten
 {
 return this._email; 
 } 
 einstellen
 {
 this._email = wert; 
 ReplaceList (); //**
 } 
} 




0
Myra