EMZETT.
Login

Kurz: Ein Record erzeugt Eigenschaften, Konstruktor, ToString, Gleichheit nach Inhalt und with-Kopien in einer Zeile:

Teil des Kurses C#

Kapitel 9 von 16 im Kurs C#. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Records: unveränderliche Datenklassen

Ein Record erzeugt Eigenschaften, Konstruktor, ToString, Gleichheit nach Inhalt und with-Kopien in einer Zeile:

var mia = new Person("Mia", 17);
var tom = mia with { Name = "Tom" };                         // Kopie mit Änderung
Console.WriteLine(mia);
Console.WriteLine($"{tom} {mia == new Person("Mia", 17)} {ReferenceEquals(mia, new Person("Mia", 17))}");
var (name, alter) = mia;                                     // Dekonstruktion
Console.WriteLine($"{name} {alter}");
 
record Person(string Name, int Alter);

Ausgabe:

Person { Name = Mia, Alter = 17 }
Person { Name = Tom, Alter = 17 } True False
Mia 17

record struct ist die Variante als Werttyp. Records eignen sich für Daten, die nur transportiert werden (DTOs, Nachrichten, Konfiguration).

struct: Werttyp

Eine struct liegt (meist) direkt im Speicher, Zuweisung kopiert. Gut für kleine, unveränderliche Daten:

var a = new Punkt(1, 2);
var b = a;                                                    // Kopie!
b.X = 99;
Console.WriteLine($"{a.X} {b.X}");
Console.WriteLine(new Punkt(3, 4).Laenge);
 
struct Punkt(double x, double y)
{
    public double X { get; set; } = x;
    public double Y { get; set; } = y;
    public readonly double Laenge => Math.Sqrt(X * X + Y * Y);
}

Ausgabe:

1 99
5

enum: Aufzählungen

var tag = Wochentag.Freitag;
Console.WriteLine($"{tag} {(int) tag} {Enum.Parse<Wochentag>("Montag")} {Enum.GetNames<Wochentag>().Length}");
Console.WriteLine(Enum.TryParse("Sonntag", out Wochentag t) && t == Wochentag.Sonntag);
 
var rechte = Rechte.Lesen | Rechte.Schreiben;                // Flags kombinieren
Console.WriteLine($"{rechte} {rechte.HasFlag(Rechte.Schreiben)} {rechte.HasFlag(Rechte.Loeschen)}");
 
enum Wochentag { Montag = 1, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag }
[Flags] enum Rechte { Keine = 0, Lesen = 1, Schreiben = 2, Loeschen = 4 }

Ausgabe:

Freitag 5 Montag 7
True
Lesen, Schreiben True False

Pattern Matching

Mit Mustern prüfst du Typen und Werte und zerlegst Objekte:

object[] dinge = [42, "Text", 3.5, null, new[] { 1, 2, 3 }, new Punkt2(1, 2), -7];
foreach (var d in dinge) Console.WriteLine(Beschreibe(d));
 
string Beschreibe(object? o) => o switch
{
    null => "nichts",
    int n when n < 0 => $"negative Zahl {n}",
    int n => $"Ganzzahl {n}",
    string { Length: > 3 } s => $"langer Text {s}",
    string s => $"Text {s}",
    double d => $"Kommazahl {d}",
    int[] { Length: 3 } => "Array mit 3 Elementen",
    Punkt2 { X: 0, Y: 0 } => "Ursprung",
    Punkt2(var x, var y) => $"Punkt {x}/{y}",
    _ => "unbekannt",
};
 
record Punkt2(int X, int Y);

Ausgabe:

Ganzzahl 42
langer Text Text
Kommazahl 3.5
nichts
Array mit 3 Elementen
Punkt 1/2
negative Zahl -7
MusterBeispiel
Typint n
Konstantenull, 5, "x"
Relational> 3, <= 10
Logischand, or, not
EigenschaftPerson { Alter: >= 18 }
PositionalPunkt2(var x, var y)
Liste[1, 2, ..], [var erstes, .., var letztes]
isif (o is string s && s.Length > 3)
object o = "Hallo";
if (o is string s && s.Length > 3) Console.WriteLine(s.ToUpper());
if (o is not int) Console.WriteLine("kein int");
 
int[] z = [1, 2, 3, 4, 5];
string r = z switch
{
    [] => "leer",
    [var einziges] => $"eins: {einziges}",
    [var erstes, .., var letztes] => $"von {erstes} bis {letztes}",
};
Console.WriteLine(r);
 
int alter = 25;
Console.WriteLine(alter is >= 18 and < 65 ? "erwerbsfähig" : "andere");

Ausgabe:

HALLO
kein int
von 1 bis 5
erwerbsfähig

Tupel und Wertegleichheit

var a = (Name: "Mia", Alter: 17);
var b = (Name: "Mia", Alter: 17);
Console.WriteLine($"{a == b} {a.Name} {a.Item2}");
(string, int) zahl = ("x", 1);
Console.WriteLine(zahl);

Ausgabe:

True Mia 17
(x, 1)

Wann was?

TypVerwendung
classObjekte mit Identität, Zustand, Verhalten
recordunveränderliche Daten, Gleichheit nach Inhalt
struct / record structkleine Werte (Punkt, Farbe)
enumfeste Wertemenge
Tupelkurze, lokale Wertepaare

Merke

  • record erzeugt Eigenschaften, Gleichheit, ToString und with-Kopien
  • struct ist ein Werttyp: Zuweisung kopiert
  • enum mit [Flags] kombiniert Optionen
  • Pattern Matching (switch, is) prüft Typ, Wert, Eigenschaften und Listen
  • Tupel (Name: "x", Alter: 1) sind praktische kleine Datenträger

Übungsaufgabe

Modelliere eine Zahlungsart als abstrakten Record Zahlung mit drei abgeleiteten Records und beschreibe sie mit einem switch-Ausdruck.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Vererbung, Interfaces und Polymorphie

Weiter: Null-Sicherheit und Ausnahmen

Alle Kapitel: C# im Überblick