C# und {get; set;}?
namespace GetSet
{class Program
{public static double sek { get; set; }}
}
was macht dieser angabe?? was könnte ich NICHT machen, wenn ich get;set nicht benutzte? ich müsste eine variable "sek" manuell mit Werten füllen. Aber Irgendwie finde ich den vorteil dafür nicht... bitte hilfe, danke
2 Antworten
Das sind Getter und Setter. Zugegeben, wenn diese leer sind, sind diese nicht sonderlich sinnvoll (bieten meine Vorteile).
Du behälst aber dir Möglichkeit offen in der Zukunft weiter Logik einzubauen. Wenn du den Setter auslässt, hast du ein readonly Attribut. Genauso kannst du abgeleitete Attribute mit nur einem Getter realisieren.
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/properties
Das erklärt dir erstmal was "Properties" sind. Getter und Setter sind Funktionen. Was du hier benutz sind die "automatisch implementieren Eigenschaften".
Die Doku erklärt auch, wie man diese Funktionen implementieren kann. Dazu kommen dann noch Sachen wie das Weglassen des Setters oder des Getters.
Ein grundlegendes Konzept der objektorientierten Programmierung ist die Kapselung. Die Zustandsänderung von Feldern nach außen hin wird geschützt.
Nimm nur einmal dieses Beispiel als Ausgangssituation:
class Adult
{
public int age;
}
Für Objekte dieser Klasse könntest du das Alter frei über das Feld ändern:
Adult someAdult = new Adult();
someAdult.age = 22;
Nun machst du das vielleicht so für ein Programm, möchtest aber auch sicherstellen, dass das Mindestalter immer bei 18 liegt. Das bedeutet, du müsstest immer dann, wenn du das Feld veränderst, erst eine Prüfung einbauen:
int age = // ...
if (age >= 18)
{
someAdult.age = age;
}
Das bedeutet zum einen schnell viel Schreibarbeit und zum anderen baust du dir damit eine potenzielle Fehlerquelle. Es ist leicht, sich an einer Stelle zu vertippen oder vielleicht fällt dir später einmal ein, dass du das Mindestalter nochmal ändern möchtest und dann müsstest du jedes Vorkommen im Programm ändern.
An dieser Stelle kommt die Kapselung mit Hilfe des Properties ins Spiel:
class Adult
{
private int _age;
public int Age
{
get => _age;
set
{
if (_age != value && value >= 18)
{
_age = value;
}
}
}
}
// usage:
Adult someAdult = new Adult();
someAdult.Age = 21;
Es stellt eine Schnittstelle nach außen, die das Feld verwaltet. Für das Property (bzw. für Getter/Setter) kann eigene Logik implementiert werden, während das Feld gegen äußeren Zugriff geschützt wird (nicht wundern, der Unterstrich am Anfang des Namens ist nur eine Konvention, die private Member kennzeichnet).
Das Beispiel selbst zeigt nun nur einen Fall, bei dem über den Setter Werte gefiltert werden. Andersherum geht das auch im Getter. Du könntest beispielsweise eine Liste an Namen anlegen und dazu ein Property, welches dir nur die Namen herausgibt, die mit A beginnen:
private string[] _names;
public IEnumerable<string> NamesStartingWithA
{
get
{
return _names.Where(name => name.StartsWith("A"));
}
}
Ein anderer Anwendungsfall wäre ein einfacher Cache:
private Result _result;
public Result CalculationResult => _result ?? (_result = Calculate());
private Result Calculate()
{
/* some complex calculation ... */
}
Beim ersten Aufruf des Properties wird eine schwergewichtige Berechnung durchgeführt und das Ergebnis in einem Feld gespeichert. Bei Folgeaufrufen wird das Ergebnis aus dem Feld genommen.
Natürlich könnte man hierfür auch Methoden verwenden, doch so lange keine Eingaben von außen (Parameter) benötigt werden, kann man sich an der Stelle Zeichen sparen.
wie sette ich denn in dem fall?
ich möchte sek den wert 0,45 zuweisen.
programm kakk=new Programm();
kakk.sek.set=0,45; ?