Windows Developer
Dieser Beitrag aus der Kolumne .NETversum von Dr. Holger Schwichtenberg und Manfred Steyer ist erstmalig erschienen im Windows Developer 7.2012
Um zu verhindern, dass einzelne auf .NET basierende Sprachen das Konzept von Tupel auf unterschiedliche Arten implementieren, wurde in .NET 4 mit der Klasse Tuple (System.Tuple) eine einheitliche Tupel-Implementierung bereitgestellt. Ähnlich wie ein Array kann ein Tupel mehrere Werte aufnehmen. Anders als bei Arrays müssen diese jedoch nicht vom selben Typ sein. Die Typen dieser Werte werden als Typparameter angegeben. Da in Sprachen wie C# oder Visual Basic jedoch keine Möglichkeit für die Angabe einer variablen Anzahl von Typparametern vorgesehen ist, stehen unter anderem sieben Implementierungen, die mit ein bis sieben Typen parametrisiert werden können, zur Verfügung. Daneben existiert eine achte Implementierung, die neben den soeben erwähnten sieben Werten ein weiteres Tupel, dessen Werte an den ursprünglichen angehängt werden, aufnimmt. Somit können auch längere Tupel abgebildet werden. Werden hingegen an die ersten sieben Elemente Tupel übergeben, so werden diese als Tupel im ursprünglichen Tupel behandelt und nicht an diesen angehängt. Auf die einzelnen Elemente wird über die Eigenschaften Item1 bis Item7 zugegriffen. Die Eigenschaft für den Zugriff auf das im achten Parameter angegebene Tupel nennt sich Rest.
Zur Erzeugung von Tupel wurde die statische Factory-Methode Tuple.Create eingerichtet. Werden zwei Tupel mit dem Vergleichsoperator (== in C#, = in Visual Basic) verglichen, so bezieht sich dieser Vergleich auf deren Speicheradressen. Ein Vergleich mittels Equals prüft hingegen, ob die beiden Tupel dieselben Werte in derselben Reihenfolge aufweisen. Dazu wird an die Implementierung von Equals der einzelnen Elemente delegiert.
Listing 3 demonstriert die Verwendung von Tuple. Dazu wird ein Tupel
Listing 3
Tuplet1 = Tuple.Create(1, "Max", "Muster", true); Console.WriteLine(t1.Item2); var t2 = Tuple.Create(1, "Max", "Muster", true); bool equals1 = t1.Equals(t2); bool equals2 = (t1 == t2); Console.WriteLine("equals1: " + equals1); Console.WriteLine("equals2: " + equals2); var nested = Tuple.Create(8, 9, 10, 11, 12, 13, 14); var largeTuple = new Tuple (1, 2, 3, 4, 5, 6, 7, nested); var ten = largeTuple.Rest.Item3;
Listing 4
static TupleDiv(int a, int b) { int r1 = a / b; int r2 = a % b; return Tuple.Create(r1, r2); }