C# und {get; set;}?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

gguelsoy 
Fragesteller
 14.01.2022, 20:07

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; ?

0
gguelsoy 
Fragesteller
 14.01.2022, 20:13
@triopasi

du meinst kakk.Sek = 0.45; :D
aber dafür brauche ich doch keinen getter und setter dafür! das geht doch auch so??

0
triopasi  14.01.2022, 20:15
@gguelsoy

Dann lies mal meine Antwort?!

Du KANNST mit Gettern/Settern deutlich mehr machen. Tust du aber nicht weil du offensichtlich blutiger Anfänger bist und die ganzen anderen tollen Dinge noch nie gebraucht hast.

1
gguelsoy 
Fragesteller
 14.01.2022, 20:17
@triopasi

Ja, deswegen frage iich auch.... hast du kein primitives beispiel?

0
gguelsoy 
Fragesteller
 14.01.2022, 21:07
@triopasi

denkst du die seite habe ich im netz nicht gefunden? anscheinend habe ich etwas nicht vollständig vertsanden. die eigenschaft sek mutiert dank dem getset zu eine art methode mit funktion... kann man das so stehen lassen?

0
triopasi  14.01.2022, 21:11
@gguelsoy

Nein. "Sek" ist eine Property (Eigenschaft). Das ist weder eine Methode noch eine Funktion. Das ist ein eigenes Konstrukt in C#.

1
regex9  14.01.2022, 21:25
@gguelsoy

Letzten Endes werden das get- und das set-Konstrukt jeweils zu einer Methode transferiert. Du könntest auch in deinem C#-Code bereits Methoden statt Properties verwenden. Mit Properties sparst du allerdings etwas Tipparbeit.

1
triopasi  14.01.2022, 21:27
@regex9

Natürlich, intern gesehen ist das nur syntactig Sugar. Aber beim Coden ist das konzeptionell etwas gnz anderes als Methoden.

1

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.