Infografik

Spickzettel C# 9.0

Spickzettel C# 9.0

Infografik

Spickzettel C# 9.0


Top-Level-Statements

Einsprungmethode Main() ist nicht mehr verpflichtend. Man kann auch direkt „freien“ Programmcode in eine beliebige .cs-Datei schreiben. Es darf in einem C#-Projekt nicht mehr als eine Datei geben, die solch freien Code enthält! Falls es ein Top-Level-Statement und ein Main() gibt, wird void Main() ignoriert.

Init Only Properties/Init Only Setter

class Person {   
  public int ID { get; init; }
  … }

Eine Init Only Property kann man nur noch an zwei Stellen setzen:

1. Konstruktor der Klasse:

public Person(int ID) 
{ this.ID = ID; }
…
Person hs1 = new Person(123);

2. Objektinitialisierung direkt bei der Instanziierung:

Person hs2 = new Person() { ID = 123 } ;

Beides kann kombiniert werden:

Person hs3 = new Person(123) { ID = 456 };

Record-Typen

  • Untertyp von Klassen mit Codegenerierung durch Compiler

  • Wertesemantik bei Vergleich mit == und !=

  • Inhaltskopie mit with (nur oberste Ebene)

  • ToString() liefert Inhalt aller öffentlichen Fields und Properties (nur oberste Ebene)

  • Immutability möglich mit Init Only Properties

  • Vererbung von anderen Record-Typen möglich

Kurzschreibweise für Record-Typen (immutable)

record Person(int ID, string Vorname, stringName, string Status = "unbekannt");

Erbender Record-Typ:

record Dozent(int ID, string Vorname, string Name, string Status = "unbekannt", List<string> Themen = null) : Person(ID, Vorname, Name, Status); 

Langschreibweise für Record-Typen (immutable)

record Person {
  private int ID { get; init; }
  public string Vorname { get; init; }
  public string Name { get; init; }
  public string Status { get; init; } = "unbekannt";
  public Person(int id, string vorname, string name, string status = "unbekannt") {
    this.ID = id;
    this.Vorname = vorname;
    this.Name = name;
    this.Status = status;
  }
}

Erbender Record-Typ:

record Dozent : Person {
  public List<string> Themen { get; init; } = new();
  public Dozent(int id, string vorname, string name, List<string> themen) : base(id, vorname, name) {       this.Themen = themen; 
  }
}

Mischung aus Kurzschreibweise und Langschreibweise

Dieser Record-Typ ist nicht immutable, da es eine beschreibbare Property und ein beschreibbares Field gibt.

record Person(int ID, string Vorname, string Name, string Status = "unbekannt") {
  public Geschlecht Geschlecht { get; set; }
  public int Alter;
  public string GetAnrede() => Geschlecht switch {
    Geschlecht.f => "Sehr geehrte Frau " + Name,
    Geschlecht.m => "Sehr geehrter Herr " + Name,
    _ => "Hallo " + Name
  };
}

Record-Typen verwenden

Record-Instanz erzeugen:

Person hs = new Person(123, "Holger", "Schwichtenberg...