Record Types und Unveränderliche Objekte in C#
Lernen Sie Record Types und unveränderliche Objekte in C# kennen, inklusive Value Equality, with-Expressions und Best Practices.
Mit C# 9 wurden record-Typen eingeführt, die insbesondere das Erstellen von immutablen (unveränderlichen) Objekten erleichtern. Record-Typen können – ähnlich wie Klassen – sowohl Daten als auch Verhalten enthalten; ihr Hauptzweck ist jedoch die Definition von Datenobjekten (Datenmodelle, DTOs usw.) auf eine einfachere, sichere und besser lesbare Weise. Immutable Objekte sind Objekte, deren Werte nach der Erstellung nicht mehr verändert werden können. Dieser Ansatz erhöht insbesondere in Multi-Threading-Szenarien die Sicherheit und verringert das Fehlerrisiko.
Was ist ein Record?
Das Schlüsselwort record wird verwendet, um Datentypen ähnlich zu Klassen oder Strukturen zu definieren.
Standardmäßig bieten Records eine wertbasierte Gleichheit (value-based equality).
Das bedeutet: Wenn die Felder zweier Record-Objekte gleich sind, gelten die Objekte als gleich.
public record Person(string Name, int Age);
class Program
{
static void Main()
{
var p1 = new Person("Hans", 30);
var p2 = new Person("Hans", 30);
Console.WriteLine(p1 == p2); // True (wertbasierter Vergleich)
}
}
Immutable Eigenschaften
In Record-Typen können Eigenschaften standardmäßig mit dem init-Accessor definiert werden.
Dadurch können Werte bei der Objekterstellung gesetzt, aber anschließend nicht mehr verändert werden.
public record Product
{
public string Name { get; init; } = string.Empty;
public decimal Price { get; init; }
}
class Program
{
static void Main()
{
var p = new Product { Name = "Stift", Price = 12.5m };
Console.WriteLine($"{p.Name} - {p.Price} EUR");
// p.Price = 15m; // Kompilierungsfehler! (init-only Property)
}
}
Der with-Ausdruck
Mit Record-Typen kann der with-Ausdruck verwendet werden, um eine Kopie eines vorhandenen Objekts zu erstellen
und dabei nur die gewünschten Felder zu ändern. Dies ist besonders nützlich beim Arbeiten mit immutablen Objekten.
var p1 = new Product { Name = "Notizbuch", Price = 45m };
// Erstelle eine Kopie mit dem with-Ausdruck und ändere den Preis
var p2 = p1 with { Price = 40m };
Console.WriteLine(p1.Price); // 45
Console.WriteLine(p2.Price); // 40
Record Class vs. Record Struct
Mit C# 10 wurde die Unterstützung für record struct eingeführt.
Das bedeutet, dass ein Record nicht nur als klassenbasierter Typ, sondern auch als Werttyp definiert werden kann.
record class ist ein Referenztyp, während record struct ein Werttyp ist.
public record struct Point(int X, int Y);
class Program
{
static void Main()
{
var a = new Point(1, 2);
var b = new Point(1, 2);
Console.WriteLine(a == b); // True (wertbasierte Gleichheit)
}
}
Vorteile von Immutable Objekten
- Thread-Safe: Objekte sind in Multi-Threading-Umgebungen sicher, da sie nicht verändert werden können.
- Keine Seiteneffekte: Eignet sich für funktionale Programmierung; dieselbe Eingabe liefert immer dieselbe Ausgabe.
- Einfacheres Debugging: Da sich der Objektzustand nicht ändert, wird das Debuggen einfacher.
- Bessere Lesbarkeit: Datenmodelle werden klarer und kürzer definiert.
Beispiel: Immutable Datenmodell
Im folgenden Beispiel wird das Order-Objekt als immutable definiert,
und mit dem with-Ausdruck werden neue Versionen erstellt.
public record Order(int Id, string Customer, decimal Amount);
class Program
{
static void Main()
{
var o1 = new Order(1, "Hans", 500m);
Console.WriteLine(o1);
// Erstelle eine Kopie mit dem with-Ausdruck
var o2 = o1 with { Amount = 600m };
Console.WriteLine(o2);
}
}
// Ausgabe:
Order { Id = 1, Customer = Hans, Amount = 500 }
Order { Id = 1, Customer = Hans, Amount = 600 }
TL;DR
record: Neuer Typ, der wertbasierte Gleichheit bietet.init-Eigenschaften: Werden bei der Objekterstellung gesetzt, können danach nicht mehr geändert werden.with-Ausdruck: Wird verwendet, um Kopien von immutablen Objekten zu erzeugen.record class= Referenztyp,record struct= Werttyp.- Immutable Objekte sind thread-sicher, zuverlässig und bieten ein lesbares Modell.
Ähnliche Artikel
Kapselung, Vererbung und Polymorphismus in C#
Lernen Sie Kapselung, Vererbung und Polymorphismus in C# mit Beispielen, um zentrale OOP-Konzepte sicher anzuwenden.
Klassen, Objekte, Eigenschaften und Methoden in C#
Erlernen Sie die Grundlagen von Klassen, Objekten, Eigenschaften und Methoden in C# für objektorientierte Programmierung.