Wissen von A bis Z

Tuples

Manchmal ist eine ganze Klasse einfach zu viel des Guten – hier kommen Tuples ins Spiel.

Tuples (ValueTuple) sind in C# leichtgewichtige, aus mehreren Komponenten zusammengesetzte Werttypen, die mehrere Werte ohne explizite Klassen- oder Struktur-Definition transportieren. Sie wurden mit C# 7 (2017) als Sprachfeature auf Basis von System.ValueTuple eingeführt und ergänzen die schon länger existierende, klobigere Klasse System.Tuple aus dem .NET Framework 4.

Eingesetzt werden Tuples vor allem als Mehrfach-Rückgabewerte aus Methoden (etwa eine Methode GetUser, die Name und Age als benanntes Tuple zurückgibt), in lokalen Hilfsstrukturen, beim Dekonstruieren in Pattern-Matching-Kontexten, in LINQ-Pipelines (z. B. innerhalb von Select-Projektionen) sowie in Tests, in denen ad-hoc-strukturierte Daten erzeugt werden müssen, ohne eine eigene Klasse zu definieren. Über Tuple-Deconstruction können einzelne Komponenten direkt einzelnen Variablen zugewiesen werden.

Der Einsatzzweck und das gelöste Problem ergeben sich aus zwei klassischen Ärgernissen: out-Parametern für Mehrfach-Rückgaben (umständlich, schlecht in LINQ verwendbar) und manuell geschriebenen Helper-Klassen für simple Datenpaare. Tuples liefern eine syntaktisch klare Alternative mit benannten Komponenten, Werte-Gleichheit, IEquatable-Implementierung und ohne Heap-Allokation (anders als die alte Tuple-Klasse) — was sie im Hot Path performant macht.

Historisch ist die Idee von Tuples in funktionalen Sprachen (ML, Haskell, F#) seit Jahrzehnten Standard. C# 7 hat sie über das System.ValueTuple-Paket nachgereicht, das auf älteren .NET-Frameworks per NuGet nachinstalliert werden konnte. Spätere Versionen haben Tuple-Pattern-Matching, Tuple-Equality und Tuple-Updates über Records ergänzt; Tuples bleiben aber bewusst syntaktisch leichter als Records und haben ein anderes Einsatzprofil.

Eingeführt wurde das Feature vom C#-Sprachteam um Mads Torgersen, mit Stephen Toub und Lucian Wischik aus dem .NET-Runtime-Umfeld. Die Entscheidung für die kurze Klammer-Syntax statt einer Schlüsselwort-basierten Lösung ist im öffentlichen Design-Protokoll als bewusster ‚aesthetic choice' dokumentiert — das Team wollte vermeiden, dass Tuples wie ein zweitklassiger Ersatz für Klassen aussehen, sondern zur Standardlösung für strukturierte Mehrfach-Werte werden, was inzwischen flächendeckend gelungen ist.

Zurück