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!
Siehe diesen Artikel http://blog.codinghorror.com/properties-vs-public-variables/
Speziell
Drei Gründe:
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).
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.
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.
Sie müssen Eigenschaften in den folgenden Fällen verwenden:
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.
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.
Dafür gibt es viele Gründe.
Hauptsächlich:
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.
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.
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.
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 (); //** } }