2012-11-30 16 views
105

Darf jemand bitte erklären, was ein Tuple ist und wie man es in einem Real World Scenario verwendet. Ich würde gerne herausfinden, wie dies meine Programmiererfahrung bereichern kann.Was und wann Tuple verwenden?

Antwort

108

Diese msdn article erklärt es sich sehr gut mit den Beispielen, „Ein Tupel ist eine Datenstruktur, die eine bestimmte Anzahl und Reihenfolge von Elementen hat“.

Tupeln werden üblicherweise in vier Arten verwendet:

  1. Um einen einzelnen Satz von Daten darstellen. Ein Tupel kann z. B. einen Datenbankdatensatz darstellen, und seine Komponenten können einzelne Felder des Datensatzes darstellen.

  2. Um einen einfachen Zugang zu und Manipulation, um einen Datensatz bereitzustellen.

  3. So geben Sie mehrere Werte aus einer Methode zurück, ohne die Parameter (in C#) oder (in Visual Basic) zu verwenden.

  4. Um mehrere Werte auf ein Verfahren durch einen einzelnen Parameter. Für Beispiel hat die Thread.Start(Object) Methode einen einzigen Parameter, der Sie einen Wert der Methode lässt liefern, die der Faden bei Startzeit ausgeführt wird. Wenn Sie ein Tuple<T1, T2, T3> Objekt als Methode Argument angeben, können Sie die Startroutine des Threads mit drei Datenelementen versorgen.

68

Ein Tupel können Sie mehrere Werte von möglicherweise unterschiedlichen Typen zu einem einzigen Objekt kombinieren, ohne eine benutzerdefinierte Klasse erstellen zu müssen. Dies kann nützlich sein, wenn Sie eine Methode schreiben möchten, die beispielsweise drei verwandte Werte zurückgibt, aber keine neue Klasse erstellen soll.

Normalerweise wenn Sie eine Klasse erstellen sollten, da dies ermöglicht es Ihnen, jede Eigenschaft nützliche Namen zu geben. Code, der Tupel wird schnell unlesbar geworden, da die Eigenschaften genannt Item1, Item2, Item3, etc ..

+28

Ich verwende es maximal für 2 Werte und jede von verschiedenen Typen, d. H. Zeichenfolge, int. Sonst wird es der schlechteste Code, den du schreiben kannst. – Ondra

+3

Halten Sie die Nutzung begrenzt, vielleicht bevorzugen Sie es nur privat innerhalb einer Klasse/Modul zu verwenden. Außerdem kann die Tupel-Verwendung, die komplexe Typen ("Kunde", "Mitarbeiter" usw.) enthält, etwas einfacher als primitive sein. Nichts ist schlimmer, als zu versuchen, mit vielen Tupel s zu arbeiten. –

16

Tuple Klassen ermöglichen es Entwicklern, ‚schnelle und faul‘ durch nicht definiert, eine bestimmte Klasse für eine bestimmte Verwendung ausgiebig verwendet.

Die Eigenschaftsnamen sind element1, Element2, Item3 ..., die in einigen Fällen oder ohne Dokumentation kann nicht sinnvoll sein.

Tuple-Klassen haben stark generische Parameter eingegeben. Dennoch können Benutzer der Tuple-Klassen aus der Art der generischen Parameter schließen.

+1

Also sollte C# 7 es einfacher gemacht haben, Klassen/Objekte on-the-fly anstatt dieser Tupel-Sache zu erstellen? –

32

Der Unterschied zwischen einem Tupel und einer Klasse ist, dass ein Tupel keine Eigenschaftsnamen hat. Das ist fast nie eine gute Sache, und ich würde nur ein Tupel verwenden, wenn die Argumente ziemlich bedeutungslos sind, wie in einer abstrakten mathematischen Formel Eg. Der abstrakte Kalkül über 5,6,7 Dimensionen könnte ein Tupel für die Koordinaten enthalten.

+1

In diesem Fall (wo wahrscheinlich die Arten von Werten sind die gleichen) mit einem einfachen Array ist nicht genug? Es gibt einen Vorteil, ein Tuple zu verwenden? –

+0

Die Typen könnten genauso einfach anders sein, aber ich denke, die IComparable-Implementierung könnte manchmal im homogenen Fall von Vorteil sein. Wie Sie sagen, würde ich geneigt sein, ein Array für einfachere Szenarien zu verwenden. – Kaido

+0

Sehr nette Antwort! –

20

Dies ist das Wichtigste, was man über den Tuple-Typ wissen sollte. Tuple ist eine Klasse, keine Struktur. Es wird somit auf dem verwalteten Heap zugewiesen. Jede Klasseninstanz, die zugewiesen wird, trägt zur Last der Garbage Collection bei.

Hinweis: Die Eigenschaften Item1, Item2 und weitere haben keine Setter. Sie können sie nicht zuweisen. Das Tupel ist unveränderlich, sobald es im Speicher erstellt wurde.

+1

_ "Burden" _ - haben Sie jemals ein Garbage-Collection-Problem beobachtet? – Gusdor

+3

Absolut! Denken Sie an den Code für die Verarbeitung der Netzwerkkommunikation. Es verteilt und verteilt Tonnen von Speicher, so dass alle paar Minuten der GC ausgeführt wird und einige Sekunden dauern kann. Dies ist nicht akzeptabel, wenn sich etwas Downstream auf diese Daten in Echtzeit verlässt. Ein anderes Beispiel ist ein Gerät mit eingeschränkten Ressourcen, z. B. ein mobiles Gerät, auf dem eine Echtzeit-App ausgeführt wird, z. B. eine App für Wegbeschreibungen. – stuckintheshuck

Verwandte Themen