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);Person { Name = Mia, Alter = 17 }
Person { Name = Tom, Alter = 17 } True False
Mia 17record 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);
}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 }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);Ganzzahl 42 langer Text Text Kommazahl 3.5 nichts Array mit 3 Elementen Punkt 1/2 negative Zahl -7
| Muster | Beispiel |
|---|---|
| Typ | int n |
| Konstante | null, 5, "x" |
| Relational | > 3, <= 10 |
| Logisch | and, or, not |
| Eigenschaft | Person { Alter: >= 18 } |
| Positional | Punkt2(var x, var y) |
| Liste | [1, 2, ..], [var erstes, .., var letztes] |
is | if (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");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);True Mia 17 (x, 1)
Wann was?
| Typ | Verwendung |
|---|---|
class | Objekte mit Identität, Zustand, Verhalten |
record | unveränderliche Daten, Gleichheit nach Inhalt |
struct / record struct | kleine Werte (Punkt, Farbe) |
enum | feste Wertemenge |
| Tupel | kurze, lokale Wertepaare |
Merke
recorderzeugt Eigenschaften, Gleichheit,ToStringundwith-Kopienstructist ein Werttyp: Zuweisung kopiertenummit[Flags]kombiniert Optionen- Pattern Matching (
switch,is) prüft Typ, Wert, Eigenschaften und Listen - Tupel
(Name: "x", Alter: 1)sind praktische kleine Datenträger
Aufgabe
Modelliere eine Zahlungsart als abstrakten Record Zahlung mit drei abgeleiteten Records und beschreibe sie mit einem switch-Ausdruck.