Also irgendwie kann ich eurer kleinen Unterhaltung nicht folgen, insbesondere nicht misu
Cartman999 schrieb:
Gibt es einen Unterschied zwischen dem Code:
Code:
public Vector2 Position
{
get { return position; }
set { position = value; }
}
private Vector2 position;
position = new Vector2(100,100);
und diesem Code:
Code:
public Vector2 Position;
Position = new Vector2(100,100);
Oder sind das nur zwei verschiedene Schreibweisen?
Ich möchte eine public Variable erstellen die ich in anderen Klassen nutzen kann.
Wurde hier ja schon geschrieben. Ersteres ist ein Property. In deinem Beispiel mit "Backingstore" (private Vector2 position). Das andere ein "public field". Der Code aus deinem ersten Beispiel entspricht einem simplen Property, dass du auch als
Code:
public Vector2 Position { get; set; }
schreiben kannst.
Da hier schon der Vergleich mit Java erbracht wurde: die Getter/Setter-Methoden aus Java sind im Grunde identisch zu Properties. Diese schreibweise ist nur Eye-Candy. Intern werden ebenfalls Getter- und Setter-Methoden erzeugt.
Der Grund wieso öffentliche Felder "verpönt" sind, ist recht simple.
Zum einen hast du keine Möglichkeit irgendeine Logik, z.B. Validierung von Werten, darauf anzuwenden. Wenn irgendwer meint, er müsse jetzt Wert X darin speichern, dann ist das so. Bei einem Property kannst du den Setter deinen Bedürfnissen anpassen.
Ein weiteres Beispiel wäre die Möglichkeit benachrichtigt zu werden, wenn sich der Wert geändert hat. Ohne diese Benachrichtigungen wäre das Data-Binding gar nicht möglich.
Weiterhin kannst du mit Properties deutlich besser kapseln. Ein veröffentlichtest Feld ist für jeden lesbar
und schreibar. Zwar hast du die Möglichkeit das Feld mit
readonly zu maskieren, aber dann kannst du es selber auch nur aus dem Konstruktor bearbeiten.
Bei einem Property kann der Getter
public sein, während für den Setter
internal, private oder protected verwendet wird.