C# Properties
Properties (Eigenschaften) in C# werden verwendet um den Zugriff auf die Daten (Felder/Fields) innerhalb eines Objekts zu steuern.
Getter und Setter Methoden
Bevor es Properties gab, wurden dafür eigene Getter- und Setter-Methoden geschrieben.
public class Auto
{
// privates Feld:
// Zugriff nur von innerhalb der Klasse möglich
private string _marke;
// Getter Methode:
// Erlaub den Wert des Fields auszulesen.
// Zugriff von außen möglich (public)
public string GetMarke()
{
return _marke;
}
// Setter Methode:
// Erlaub den Wert des Fields zu ändern.
// Zugriff von außen möglich (public)
public void SetMarke(string marke)
{
_marke = marke;
}
}
// Verwendung:
Auto a = new Auto();
// Aufruf der Setter Methode
// um den Wert zu ändern.
a.SetMarke("Ferrari");
// Aufruf der Getter Methode
// um den Wert auszulesen.
string m = a.GetMarke();
a._marke = "Porsche"; // nicht möglich -> CompilerfehlerProperties
Da es sehr häufig nötig ist den Zugriff auf private Felder zu regeln, wurden zur Sprache C# Properties hinzugefügt. Diese erlauben eine vereinfachte Schreibweise.
public class Auto
{
// privates Feld:
// Zugriff nur von innerhalb der Klasse möglich
private string _marke;
// Property
public string Marke
{
get
{
return _marke;
}
set
{
_marke = value; // Im Setter ist value der zugewiesene Wert
}
}
}
// Verwendung:
Auto a = new Auto();
// Anstatt Methoden aufzurufen
// erfolgt der Zugriff von außen
// so als würde man auf ein Feld zugreifen.
// Im Hintergrund wird aber der Getter/Setter
// des Properties aufgerufen.
a.Marke = "Ferrari";
string m = a.Marke;
a._marke = "Porsche"; // nicht möglich -> CompilerfehlerAuto Properties
Da Properties sehr häufig dafür verwendet werden auf ein Field zuzugreifen, ohne weitere Logik zu beinhalten, wurde noch eine kürzere Schreibweise dafür festgelegt. Hier erstellt der Compiler automatisch ein Feld im Hintergrund, sowie den Getter und Setter.
public class Auto
{
// Auto Property
public string Marke { get; set; }
}
// Verwendung:
Auto a = new Auto();
// Die Verwendung bleibt gleich
a.Marke = "Ferrari";
string m = a.Marke;
a._marke = "Porsche"; // nicht möglich -> CompilerfehlerZugriff regeln
Um festlegen zu können, wer wann auf des Wert des Properties lesend oder schreibend zugreifen kann,
können Zugriffsmodifier an mehreren Stellen bei Properties verwendet werden.
Siehe [[Zugriffsmodifier#3-properties|3. Properties]]
Getter/Setter mit Logik
Getter und Setter können zusätzlich beliebige Logik enthalten. Dafür ist jedoch die Verwendung eines Fields nötig - Auto Properties unterstützen das nicht.
public class Auto
{
// privates Feld:
// Zugriff nur von innerhalb der Klasse möglich
private string _marke;
// Property
public string Marke
{
get
{
// Zusätzliche Logik:
// Automatisch Standardwert festlegen,
// falls noch keiner gesetzt wurde.
if (_marke == null)
{
_marke = "Opel";
}
return _marke;
}
set
{
// Zusätzliche Logik zur Validierung:
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("Marke darf nicht leer sein.");
}
_marke = value;
}
}
}Seit C#14 (.NET 10) ist es auch möglich, das Field wegzulassen. Mit dem Schlüsselwort field kann auf das automatisch angelegte Field zugegriffen werden.
public class Auto
{
// Property
public string Marke
{
get
{
// Zusätzliche Logik:
// Automatisch Standardwert festlegen,
// falls noch keiner gesetzt wurde.
if (field == null)
{
field = "Opel";
}
return field;
}
set
{
// Zusätzliche Logik zur Validierung:
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("Marke darf nicht leer sein.");
}
field = value;
}
}
}