Tuples sind in .NET nicht neu, vielmehr jedoch, wie mit ihnen bisher umgegangen wird. Dieser Beitrag bringt dir das Thema näher.
Was sind Tuples?
Tuples stellen eine geordnete, nicht veränderbare Liste von Werten dar. Schon vor C# 7.0 gab es Tuples. Hier ein Beispiel dazu:
var myTuple1 = Tuple.Create<string, string>("norbert", "eder");
var myTuple2 = new Tuple<string, string>("norbert", "eder");
Console.WriteLine($"{myTuple1.Item1} {myTuple1.Item2}");
Wie an diesem Beispiel zu sehen, ist die Verwendung etwas umständlich. Die “Liste” enhält bis zu 8 Elemente, welche über die Eigenschaften Item1
, Item2
etc. verfügbar sind.
Verwendungszweck
Wozu können Tuples verwendet werden?
- Abbildung von mehreren Datenwerten in einem Datensatz
- Abbildung einer Datenstruktur für z.B. Berechnungen
- Manipulation einer um schnell Manipulationen durchzuführen
- Rückgabe mehrerer Werte von einer Funktion ohne out oder
ref
verwenden zu müssen - Übergabe von mehreren Werten an eine Methode repräsentiert durch eine einzige Variable
Neues in C# 7.0
Was aber ist nun neu in C# 7.0? Einiges, aber zu allererst muss man sich ein Nuget-Paket installieren: System.ValueTuple.
Danach kann es mit den ersten Beispielen los gehen:
var newTuple1 = ("norbert", "eder");
var newTuple2 = (firstname: "norbert", lastname: "eder");
Console.WriteLine($"{newTuple2.firstname} {newTuple2.lastname}");
Mehrere Datenwerte können folgendermaßen per Funktion zurückgegeben werden:
private (string,string,string) GetData(long id)
{
return ("eins", "zwei", "drei");
}
private (string eins, string zwei, string drei) GetData2(long id)
{
return ("eins", "zwei", "drei");
}
Dabei wird über die Tuple Types beschrieben, wieviele Werte welchen Typs zurückgeliefert werden. Wahlweise können den Tuple-Elementen Namen gegeben werden. Im ersten Fall muss per Item1
, Item2
und Item3
auf die Werte zugegriffen werden. Im zweiten Beispiele sind sie mit eins
, zwei
und drei
benannt.
Die große Änderung in C# 7 ist nun, dass Tuples als Werttypen behandelt werden. Dadurch ergibt sich ein Vorteil in der Performance und eine bessere Möglichkeit zur Steuerung des Speicherverbrauchs.
Das System.ValueTuple
-Paket hängt auch Extension-Methods an ValueTuple
und Tuple
. Damit können diese einfach umgewandelt werden.
So fein das nun auch alles klingt, sollte man sich doch gut überlegen, wann Tuples sinnvoll eingesetzt werden können.