Records sind ein mit C# 9 (2020) eingeführter Referenztyp (und mit C# 10 zusätzlich als record struct verfügbar), der speziell für unveränderliche Datenobjekte konzipiert ist. Records bringen automatisch generierte Werte-Gleichheit, ToString-Implementierung, Deconstruct-Methoden und einen with-Ausdruck zur nicht-destruktiven Mutation mit, ohne dass diese Mechanismen manuell implementiert werden müssen.
Eingesetzt werden Records bevorzugt für DTOs, API-Modelle, Value Objects in Domain-Driven Design, Events und Messages in Event-Sourcing-Architekturen, Konfigurationsobjekte und überall dort, wo Daten primär gleich sind, wenn ihre Inhalte gleich sind. In Verbindung mit Pattern Matching ergeben sich besonders kompakte, deklarative Datenflüsse — typische Beispiele finden sich in Compilern, Parsern und Pipelines.
Der Einsatzzweck und das gelöste Problem ergeben sich aus jahrelanger Boilerplate-Belastung in C#. Eine klassische Datenklasse mit fünf Properties brauchte bislang Equals, GetHashCode, ToString, Konstruktoren und gegebenenfalls Copy-Konstruktoren — meist mehrere hundert Zeilen, die rein mechanisch waren. Mit Records werden diese Aspekte vom Compiler erzeugt, was die Fehlerquote senkt (z. B. vergessenes Updaten von Equals nach Property-Änderungen) und Code-Reviews entlastet.
Historisch sind Records in C# stark von analogen Konstrukten in Kotlin (data class), Scala (case class), F# (record types) und Java (records ab Java 14) inspiriert. Die Diskussion innerhalb des C#-Sprachteams begann mehrere Jahre vor C# 9 und wurde in den öffentlichen Sprachdesign-Notizen detailliert dokumentiert; mit Records-Strukturen in C# 10 und Verbesserungen in späteren Versionen ist das Feature zu einer der prägenden Erneuerungen der C#-9/10-Linie geworden.
Eingeführt wurde das Feature von Microsoft, federführend Mads Torgersen, Andy Gocke und Jared Parsons. Während der Designphase stand lange zur Diskussion, ob Records value- oder reference-typisch sein sollten — die letztliche Entscheidung, beides anzubieten (record class und record struct), kam erst nach umfangreichen Performance-Messungen aus realen Microservice-Workloads, die zeigten, dass insbesondere Hot-Path-DTOs erheblich vom struct-Verhalten profitieren. Damit ist die Doppellösung ein gut dokumentiertes Beispiel dafür, wie Sprachdesign-Entscheidungen in C# inzwischen empirisch durch Telemetrie und Benchmarks unterfüttert werden.