Jeder kann coden / Programmieren & TicTacToe / Objektorientierte Programmierung / Objektorientierte Programmierung in C#
Properties (Attribute) in C#¶
In C# sind Properties (Eigenschaften) spezielle Member einer Klasse, die wie Felder verwendet werden, aber Zugriffsmethoden (get
und set
) enthalten. Sie bieten eine flexible Möglichkeit, den Zugriff auf private Felder zu kontrollieren und gleichzeitig eine saubere Syntax für den Zugriff bereitzustellen.
Grundlegender Aufbau:
class Klasse
{
private int _feld;
public int Eigenschaft
{
get { return _feld; } // RĂĽckgabe des Werts
set { _feld = value; } // Setzt den Wert
}
}
get
: Wird verwendet, um den Wert der Eigenschaft zu lesen.set
: Wird verwendet, um den Wert der Eigenschaft zu schreiben. Der spezielle SchlĂĽsselwortvalue
repräsentiert den Wert, der der Eigenschaft zugewiesen wird.
Praxisbeispiel: Umweltinformatik¶
Angenommen, wir möchten eine Klasse erstellen, die Informationen über die CO₂-Bilanz eines Fahrzeuges verwaltet. Eine Eigenschaft kann genutzt werden, um sicherzustellen, dass der CO₂-Wert nur einen positiven Wert annehmen kann.
Codebeispiel¶
class Fahrzeug
{
private double _co2Emission; // privates Feld
// Property mit get und set
public double CO2Emission
{
get
{
return _co2Emission;
}
set
{
if (value < 0)
{
Console.WriteLine("CO₂-Emissionen können nicht negativ sein.");
}
else
{
_co2Emission = value;
}
}
}
// Automatisch implementierte Property
public string Fahrzeugtyp { get; set; }
// Methode zur Ausgabe von Informationen
public void Ausgabe()
{
Console.WriteLine($"Fahrzeugtyp: {Fahrzeugtyp}");
Console.WriteLine($"COâ‚‚-Emissionen: {_co2Emission} g/km");
}
}
Fahrzeug fahrzeug = new Fahrzeug();
// Fahrzeugtyp setzen
fahrzeug.Fahrzeugtyp = "Elektroauto";
Console.WriteLine("Fahrzeugtyp gesetzt auf: Elektroauto");
// COâ‚‚-Emission setzen
fahrzeug.CO2Emission = 0; // Elektromobilität: 0 Emission
Console.WriteLine("COâ‚‚-Emission auf 0 gesetzt.");
// Falsche Werte testen
fahrzeug.CO2Emission = -50; // Negativer Wert wird abgewiesen
// Ausgabe der Daten
fahrzeug.Ausgabe();
// Neues Fahrzeug erstellen
Fahrzeug fahrzeug2 = new Fahrzeug
{
Fahrzeugtyp = "Diesel",
CO2Emission = 120 // Direkte Initialisierung
};
// Ausgabe der Daten
fahrzeug2.Ausgabe();
Erklärung des Beispiels¶
Private Felder und
value
:- Das Feld
_co2Emission
ist privat und wird nur ĂĽber dieCO2Emission
-Property zugänglich gemacht. - Im
set
-Accessor wird geprĂĽft, ob der Wert positiv ist.value
repräsentiert den Wert, der der Property zugewiesen wurde.
- Das Feld
Flexibilität von Properties:
- Sie können Berechnungen oder Validierungen (wie die Prüfung auf negative Werte) im
set
-Accessor durchfĂĽhren. - Automatisch implementierte Properties wie
Fahrzeugtyp
vereinfachen den Code, wenn keine spezielle Logik notwendig ist.
- Sie können Berechnungen oder Validierungen (wie die Prüfung auf negative Werte) im
Praktische Anwendung:
- Im Kontext der Umweltinformatik könnte eine solche Klasse z.B. für Simulationen oder Bewertungen der CO₂-Bilanz von Fahrzeugflotten verwendet werden.
Vertiefung¶
Weiterführende Details zu Properties in C#¶
1. Automatisch implementierte Properties¶
Automatisch implementierte Properties vereinfachen den Code, wenn keine zusätzliche Logik in get
oder set
benötigt wird. Der Compiler erstellt automatisch ein privates Feld im Hintergrund:
public string Fahrzeugtyp { get; set; }
- Vorteil: Schneller zu schreiben und lesbar.
- Nachteil: Keine Möglichkeit für zusätzliche Logik wie Validierung oder Berechnung.
2. Read-only Properties¶
Manchmal möchte man eine Eigenschaft nur lesbar machen. Dafür wird nur ein get
definiert:
public string Hersteller { get; } = "Tesla";
Alternativ kann der Wert nur im Konstruktor oder Initialisierer gesetzt werden.
3. Write-only Properties¶
Eine Eigenschaft kann auch nur einen set
-Accessor haben. Dies wird selten verwendet, ist aber möglich:
private string _geheimeDaten;
public string GeheimeDaten
{
set { _geheimeDaten = value; }
}
Die Eigenschaft kann dann nur geschrieben, aber nicht gelesen werden.
4. Expression-bodied Properties¶
FĂĽr einfache Eigenschaften kann man eine kompakte Syntax verwenden:
public double Kilometerstand { get; private set; }
public bool IstEffizient => Kilometerstand > 100 && CO2Emission < 50;
Die Expression-bodied Properties sind besonders nĂĽtzlich fĂĽr Berechnungen oder einfache Logik.
5. Validierung in Properties¶
Wie im Beispiel gezeigt, kann die set
-Methode verwendet werden, um Werte zu validieren:
public double CO2Emission
{
get => _co2Emission;
set
{
if (value < 0)
throw new ArgumentException("COâ‚‚-Emissionen dĂĽrfen nicht negativ sein.");
_co2Emission = value;
}
}
- Vorteil: Zentrale Validierung im Setter.
- Nachteil: Kann zusätzliche Komplexität hinzufügen.
6. Static Properties¶
Eigenschaften können static
sein, um auf Klassenebene verwendet zu werden:
public static string UmweltZiel => "Reduzierung der COâ‚‚-Emissionen bis 2030.";
Diese Eigenschaft gehört zur Klasse und nicht zu einer Instanz.
7. Backerless Properties¶
Manche Eigenschaften benötigen kein privates Feld (Backer), sondern berechnen ihren Wert direkt:
public double Effizienz => Kilometerstand / CO2Emission;
Das kann praktisch fĂĽr Werte sein, die sich aus anderen Feldern oder Eigenschaften ableiten lassen.
8. Zugriffsmodifizierer auf get
und set
¶
Manchmal soll der Zugriff auf get
oder set
eingeschränkt werden, z.B. nur intern:
public double CO2Emission { get; private set; }
public class Wetterstation
{
private double _temperatur;
public double Temperatur
{
get => _temperatur;
set
{
if (value < -50 || value > 60)
throw new ArgumentOutOfRangeException("Temperatur auĂźerhalb des gĂĽltigen Bereichs.");
_temperatur = value;
}
}
public string Standort { get; set; }
public void Ausgabe()
{
Console.WriteLine($"Standort: {Standort}, Temperatur: {_temperatur}°C");
}
}
Beispiel 2: Simulation von Emissionen¶
Ein System zur Ăśberwachung von Fabriken:
public class Fabrik
{
private double _jahresEmission;
public double JahresEmission
{
get => _jahresEmission;
set
{
if (value < 0)
throw new ArgumentException("Emissionen können nicht negativ sein.");
_jahresEmission = value;
}
}
public string Name { get; set; }
public bool IstUmweltfreundlich => JahresEmission < 1000;
public void Ausgabe()
{
Console.WriteLine($"{Name} hat {(IstUmweltfreundlich ? "umweltfreundliche" : "hohe")} Emissionen: {_jahresEmission} t COâ‚‚/Jahr.");
}
}
Best Practices für Properties¶
Encapsulation (Kapselung): Verwende Properties, um den direkten Zugriff auf Felder zu vermeiden und eine zentrale Steuerung des Datenflusses zu ermöglichen.
Validation: Nutze den
set
-Accessor, um Werte zu validieren oder zu transformieren, bevor sie in das Feld geschrieben werden.Expression-bodied Properties: FĂĽr einfache Berechnungen oder Regeln bietet diese kompakte Syntax Vorteile.
Automatische Properties: Wenn keine Logik erforderlich ist, erleichtern automatisch implementierte Properties den Code.
Zugriffsmodifikatoren: Begrenze den Zugriff auf
get
oderset
, um unerwünschte Änderungen zu verhindern.
Fazit¶
Properties in C# bieten eine leistungsstarke und flexible Möglichkeit, Datenkapselung und -validierung zu implementieren. Sie sind ein zentrales Werkzeug für die saubere und sichere Verwaltung von Daten in einer Klasse und spielen eine wichtige Rolle in professionellen Anwendungen, insbesondere bei der Modellierung realer Szenarien wie in der Umweltinformatik.