Kurz: Ein Record erzeugt Eigenschaften, Konstruktor, ToString, Gleichheit nach Inhalt und with-Kopien in einer Zeile:
Teil des Kurses C#
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 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);
}Ausgabe:
1 99
5enum: 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 FalsePattern 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| 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");Ausgabe:
HALLO
kein int
von 1 bis 5
erwerbsfähigTupel 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?
| 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
Übungsaufgabe
Modelliere eine Zahlungsart als abstrakten Record Zahlung mit drei abgeleiteten Records und beschreibe sie mit einem switch-Ausdruck.
Quiz zur Selbstkontrolle
Was bewirkt der with-Ausdruck bei Records?
- Erzeugt eine Kopie mit einzelnen geänderten Werten (richtig)
- Ändert das Original
- Vergleicht zwei Records
- Löscht den Record
Wie vergleicht == zwei Records?
- Nach dem Inhalt aller Eigenschaften (richtig)
- Nach der Speicheradresse
- Nur nach dem ersten Feld
- Gar nicht
Was passiert bei var b = a, wenn a eine struct ist?
- b ist eine Kopie (richtig)
- b verweist auf dasselbe Objekt
- Ein Compilerfehler
- a wird gelöscht
Weiter im Kurs
Zurück: Vererbung, Interfaces und Polymorphie
Weiter: Null-Sicherheit und Ausnahmen
Alle Kapitel: C# im Überblick