2010-06-25 13 views

Antwort

17

Sie müssen die BCL-Designer fragen, um sicher zu sein, aber ich vermute, dass, da es ein 1-Tupel in der realen Welt gibt, die .NET-Framework-Autoren gleichwertige Symmetrie in ihrer Implementierung bereitstellen wollten.

Tuples sind die .NET-Implementierung von dem, was Sie als mathematical concept of a tuple betrachten würden.

Jetzt, da Sie für die Programmierung sind gefragt verwendet für Tuple<T>, würde ich auch Antwort, dass es .NET-Sprachen (wie F #), die Tuple<> zur Darstellung von Dingen wie Rückgabewerte von Funktionen nutzen könnte. Da eine F # -Funktion dadurch sicher ein 1-Tupel zurückgeben könnte, fügt sie dem Verhalten und der Sprache der Sprache Symmetrie und Konsistenz hinzu.

Ihr Beispiel mit 8+ Tupeln ist wahrscheinlich auch legitim, da die Rest Eigenschaft ein 1-Tupel sein könnte, um den "Überlauf" darzustellen.

+3

Ich glaube nicht, es ist tatsächlich möglich, ein 1-Tupel in idiomatischem F # zu konstruieren, weil der Komma-Operator ein Tupel in dieser Sprache erzeugt. 'let foo = 3,5 'ist die Definition eines 2-Tupel mit 3 und 5, aber die einzige Möglichkeit, ein 1-Tupel in F # zu erstellen, denke ich, ist die gleiche, wie in C#: 'neues System.Tuple (5)' –

+2

Oder 'Tuple.Create' natürlich. Soweit ich weiß, sind 1-Tupel die einzige Sorte, für die F # keinen syntaktischen Zucker liefert. –

+2

@LBushkin Hallo, haben Sie jemals tatsächlichen F #/C# -Code gesehen, der 1-Tupel verwendet? Ich bin neugierig auf die Anwendungsfälle der realen Welt. – ZhongYu

4

Alle Tupeltypen implementieren ITuple, also denke ich, dass wenn Sie einen Rückgabetyp haben möchten, der ein ITuple ist, Sie die Option benötigen, einen einzelnen Wert zu haben, wie Sie vorschlagen.

+3

Das einzige Problem dabei ist, dass ITuple intern in mscorlib ist, also kann ich es sowieso nicht verwenden :) –

+2

Das erklärt, warum MSDN keine Dokumentation darüber hat, abgesehen von der Deklaration der verschiedenen Tuple-Typen ... ;) – Oded

7

Tuple automatisch implementieren IStructuralComparable und IStructuralEquatable, unter anderem. Dadurch können Tupel direkt verglichen und sortiert werden. Von Bill McCarthy Artikeln im Dezember 2009 Ausgabe von Visual Studio Magazinen „Typen und Tupeln in .NET 4“:

Obwohl Tupel einfach und unscheinbar aussieht, haben sie starke Typisierung und wichtigen Vergleich und Gleichheit Funktionalität . Tupel sind über die Grenzen von Methoden, Klassen oder sogar Maschinen hinweg nützlich.

Indem Sie Ihren Datentyp in ein Tupel, auch nur aus einem Element, setzen, werden Ihnen Unveränderbarkeit, Gleichwertigkeit und Vergleichbarkeit garantiert. Für Tupel, die nur aus einem Element bestehen, ist der Hauptvorteil der Verwendung eines Tupels die Unveränderbarkeit: Sobald das Tupel erstellt ist, können sich seine Daten für die Lebensdauer des Tupels niemals ändern.

+6

Ich sehe nicht, wie Unveränderbarkeit, Gleichwertigkeit und Vergleichbarkeit erreicht werden. Wenn Sie veränderbare Daten in ein Tupel setzen, können Sie diese Daten immer noch mutieren. Ähnliches für Gleichwertigkeit und Vergleichbarkeit ... Wie würde das Hinzufügen der Daten zu einem Tupel eine (sinnvolle) Art der Vergleichbarkeit hinzufügen? –

+0

@johan Sie bringen einen guten Punkt, vor allem, wie es für komplexe Objekte gilt. Das könnte für sich allein eine gute eigene Frage sein. –

+0

Yup, 'Tuple ' kann wie Wrapper verwendet werden, manchmal nützlich. – nawfal

3

Obwohl dies ein alter Thread ist, bereitete ich eine Antwort für Why use a 1-tuple, Tuple<T1> in C#? vor, die jetzt als ein Duplikat markiert ist.

Ein möglich Verwendung eines 1-Tuple, ist eine Instanz null zurück, wenn kein Wert ist, sondern dass null des Warenwertes selbst, bedeutet nicht, kein Ergebnis.

Zum Beispiel (kein sehr gutes richtigen Beispiel, aber hoffentlich vermittelt er den Punkt)

static List<string> List = new List<string> {"a", "b", null, "c"}; 

    static Tuple<string> GetItemAtIndex(int index) 
    { 
     if (index < 0 || index >= List.Count) 
      return null; 
     return Tuple.Create(List[index]); 
    } 

Der Aufrufcode würde wissen, dass, wenn das Tupel selbst null ist, ist es nicht in der Liste noch nicht gab, Wenn jedoch Item1 gleich null ist, war in der Liste tatsächlich ein Nullelement vorhanden. Natürlich gibt es in diesem Beispiel viele bessere Problemumgehungen, aber es könnte auch für ein Ergebnis aus einer Datenbank gelten: kein Ergebnis gefunden oder ein Ergebnis, das null ist.

Die gleiche Logik erweiternd, kann ein Tuple verwendet werden, um einfach generische Methoden zu erstellen, die null für jeden Typ zurückgeben können. Zum Beispiel

static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn) 
    { 
     if (rec == null) return null; 
     //extra example, access would be checked by something like CheckCurrentUserAccess(rec) 
     bool AccesDenied = true; 
     if (AccesDenied) return null; //sometimes you don't want to throw an exception ;) 

     return Tuple.Create(fn(rec)); 
    } 

Sie könnten Nullable<T> zurückkehren, aber das wäre für structs nur funktionieren, wo dies mit jeder Art funktioniert, wenn auch int, string, int?, MyClass, etc

+0

Das verwendet im Grunde das 1-Tupel als eine Maybe/Option Monad. Interessanter, aber möglicherweise unerwarteter Anwendungsfall, aber es ist im Rahmen, während ein Maybe/Option Monad nicht ist. –

Verwandte Themen