Ich schaue mir die neue C # -Funktion von Tupeln an. Ich bin gespannt, welches Problem das Tupel lösen soll.
Wofür haben Sie Tupel in Ihren Apps verwendet?
Aktualisieren
Vielen Dank für die bisherigen Antworten. Lassen Sie mich sehen, ob ich die Dinge im Kopf habe. Ein gutes Beispiel für ein Tupel wurde als Koordinaten angegeben. Sieht das richtig aus?
var coords = Tuple.Create(geoLat,geoLong);
Verwenden Sie dann das Tupel wie folgt:
var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");
Ist das korrekt?
Antworten:
Beim Schreiben von Programmen ist es äußerst üblich, eine Reihe von Werten logisch zu gruppieren, die nicht genügend Gemeinsamkeiten aufweisen, um die Erstellung einer Klasse zu rechtfertigen.
In vielen Programmiersprachen können Sie eine Reihe ansonsten nicht verwandter Werte logisch gruppieren, ohne einen Typ auf nur eine Weise zu erstellen:
Logischerweise ist dies genau das Gleiche wie eine Methode M, die ein Argument verwendet, das ein 3-Tupel von int, string, double ist. Aber ich hoffe du würdest eigentlich nicht machen:
es sei denn, Dokumente hatten eine andere Bedeutung in der Geschäftslogik.
Das Konzept, "eine Reihe von ansonsten nicht zusammenhängenden Daten in einer Struktur zusammenzufassen, die leichter als eine Klasse ist", ist an vielen, vielen Stellen nützlich, nicht nur für formale Parameterlisten von Methoden. Dies ist nützlich, wenn eine Methode zwei Dinge zurückgeben muss oder wenn Sie ein Wörterbuch aus zwei Daten anstatt aus einem ableiten möchten, und so weiter.
Sprachen wie F #, die Tupeltypen von Haus aus unterstützen, bieten ihren Benutzern ein hohes Maß an Flexibilität. Sie sind ein äußerst nützlicher Satz von Datentypen. Das BCL-Team hat beschlossen, mit dem F # -Team zusammenzuarbeiten, um einen Tupeltyp für das Framework zu standardisieren, damit jede Sprache davon profitieren kann.
Derzeit gibt es jedoch keine Sprachunterstützung für Tupel in C #. Tupel sind nur ein anderer Datentyp wie jede andere Framework-Klasse. Es ist nichts Besonderes an ihnen. Wir erwägen, Tupel in hypothetischen zukünftigen Versionen von C # besser zu unterstützen. Wenn jemand irgendwelche Gedanken darüber hat, welche Art von Funktionen mit Tupeln Sie sehen möchten, würde ich sie gerne an das Designteam weitergeben. Realistische Szenarien überzeugen mehr als theoretische Überlegungen.
quelle
Item1
,Item2
usw ... Wenn Tupeln jemals Sprachunterstützung in C # tun erreichen, wäre es wunderbar sein , ihre Mitglieder zu ermöglichen , in einer Weise benannt (oder zumindest aliased) werden , die Code ermöglicht , dass Anwendungen sie verständlicher zu sein. In einer solch hypthetischen Zukunft würde ich auch gerne Tupel mit geeigneter "Form" als rechtliche Parameter für Methoden sehen, die einzelne Parameter verwenden (und umgekehrt). SoTuple<int,string,bool>
kann übergebenM(int,string,bool)
. Dies würde das Auswendiglernen von Methoden erheblich vereinfachen.public
Zugriffstypen mit unbenannten Mitgliedern . Ich möchte lieber, dass der Programmierer eine mit benannten Mitgliedern schreibt und diese zurückgibt, als sich mit einer zu befassen , die mir nichts über die Semantik seiner Mitglieder sagt.struct
struct
tuple
Tupel bieten eine unveränderliche Implementierung einer Sammlung
Abgesehen von den üblichen Verwendungen von Tupeln:
Unveränderliche Objekte sind von Natur aus threadsicher:
Aus "Unveränderliches Objekt" auf Wikipedia
quelle
Es bietet eine Alternative zu
ref
oderout
wenn Sie eine Methode haben, die als Teil ihrer Antwort mehrere neue Objekte zurückgeben muss.Sie können auch einen integrierten Typ als Rückgabetyp verwenden, wenn Sie nur zwei oder drei vorhandene Typen mischen müssen und nicht nur für diese Kombination eine Klasse / Struktur hinzufügen müssen. (Wünschten Sie sich jemals, eine Funktion könnte einen anonymen Typ zurückgeben? Dies ist eine teilweise Antwort auf diese Situation.)
quelle
Es ist oft hilfreich, einen "Paar" -Typ zu haben, der nur in schnellen Situationen verwendet wird (z. B. wenn zwei Werte von einer Methode zurückgegeben werden). Tupel sind ein zentraler Bestandteil funktionaler Sprachen wie F #, und C # hat sie auf dem Weg aufgenommen.
quelle
Sehr nützlich, um zwei Werte von einer Funktion zurückzugeben
quelle
Persönlich finde ich, dass Tupel ein iterativer Teil der Entwicklung sind, wenn Sie sich in einem Untersuchungszyklus befinden oder einfach nur "spielen". Da ein Tupel generisch ist, denke ich eher daran, wenn ich mit generischen Parametern arbeite - insbesondere, wenn ich einen generischen Code entwickeln möchte, und ich beginne am Codeende, anstatt mich zu fragen, wie mir dieser Aufruf gefallen würde sehen?".
Sehr oft stelle ich fest, dass die Sammlung, die die Tupelformulare bilden, Teil einer Liste wird, und wenn ich auf Liste> starre, drückt dies nicht wirklich die Absicht der Liste aus oder wie sie funktioniert. Ich "lebe" oft damit, möchte aber die Liste manipulieren und einen Wert ändern. An diesem Punkt möchte ich nicht unbedingt ein neues Tupel dafür erstellen, daher muss ich meine eigene Klasse oder Struktur erstellen um es zu halten, damit ich Manipulationscode hinzufügen kann.
Natürlich gibt es immer Erweiterungsmethoden - aber oft möchten Sie diesen zusätzlichen Code nicht auf generische Implementierungen erweitern.
Es gab Zeiten, in denen ich Daten als Tupel ausdrücken wollte und keine Tupel zur Verfügung hatte. (VS2008) In diesem Fall habe ich gerade meine eigene Tuple-Klasse erstellt - und ich mache sie nicht threadsicher (unveränderlich).
Ich bin also der Meinung, dass Tuples faul programmieren, wenn ein Typname verloren geht, der seinen Zweck beschreibt. Der andere Aufwand besteht darin, dass Sie die Signatur des Tupels dort deklarieren müssen, wo es als Parameter verwendet wird. Nach einer Reihe von Methoden, die aufgebläht aussehen, haben Sie vielleicht das Gefühl, dass es sich lohnt, eine Klasse zu erstellen, da sie die Methodensignaturen bereinigt.
Ich beginne damit, dass die Klasse ein öffentliches Mitglied der Klasse ist, in der Sie bereits arbeiten. In dem Moment, in dem sie über eine Sammlung von Werten hinausgeht, erhält sie eine eigene Datei und verschiebt sie aus der enthaltenen Klasse.
Rückblickend glaube ich, dass ich Tupel benutze, wenn ich nicht losgehen und eine Klasse schreiben möchte und nur darüber nachdenken möchte, was ich gerade schreibe. Dies bedeutet, dass sich die Signatur des Tupels im Text eine halbe Stunde lang stark ändern kann, während ich herausfinde, welche Daten ich für diese Methode benötige und wie sie die zurückgegebenen Werte zurückgibt.
Wenn ich die Möglichkeit habe, Code umzugestalten, frage ich oft nach dem Platz eines Tupels darin.
quelle
Alte Frage seit 2010 und jetzt im Jahr 2017 ändert sich Dotnet und wird schlauer.
C # 7 führt die Sprachunterstützung für Tupel ein, die semantische Namen für die Felder eines Tupels mithilfe neuer, effizienterer Tupeltypen ermöglicht.
In vs 2017 und .Net 4.7 (oder bei der Installation des Nuget-Pakets System.ValueTuple) können Sie ein Tupel auf sehr effiziente und einfache Weise erstellen / verwenden:
Rückgabe von mehr als einem Wert aus einer Methode:
Weitere Informationen finden Sie unter: https://docs.microsoft.com/en-us/dotnet/csharp/tuples
quelle
Ein Tupel wird häufig verwendet, um mehrere Werte von Funktionen zurückzugeben, wenn Sie keinen bestimmten Typ erstellen möchten. Wenn Sie mit Python vertraut sind, hat Python dies schon lange.
quelle
Rückgabe von mehr als einem Wert von einer Funktion. getCoordinates () ist nicht sehr nützlich, wenn es nur x oder y oder z zurückgibt, aber es scheint auch ziemlich schwer zu sein, eine vollständige Klasse und ein Objekt für drei Ints zu erstellen.
quelle
Eine häufige Verwendung könnte darin bestehen, das Erstellen von Klassen / Strukturen zu vermeiden, die nur zwei Felder enthalten. Stattdessen erstellen Sie ein Tupel (oder vorerst ein KeyValuePair). Nützlich als Rückgabewert, vermeiden Sie es, N Parameter auszugeben ...
quelle
Ich finde, dass das KeyValuePair in C # aktualisiert wird, um die Schlüsselwertpaare in einem Wörterbuch zu durchlaufen.
quelle
KeyValuePair
kann als spezielle Problemumgehung angesehen werden. In Python gibt das Durchlaufen einesdict
Just nur Tupel (Schlüssel, Wert) zurück.Es ist sehr hilfreich bei der Rückgabe von Werten aus Funktionen. Wir können mehrere Werte zurück haben und dies ist in einigen Szenarien eine ziemliche Ersparnis.
quelle
Ich bin auf diesen Leistungsbenchmark zwischen Tupeln und Schlüssel-Wert-Paaren gestoßen, und wahrscheinlich werden Sie ihn interessant finden. Zusammenfassend heißt es, dass Tuple einen Vorteil hat, weil es eine Klasse ist, daher wird es im Heap und nicht im Stapel gespeichert, und wenn es als Argument herumgereicht wird, ist sein Zeiger das einzige, was geht. Da KeyValuePair jedoch eine Struktur ist, ist die Zuweisung schneller, bei Verwendung jedoch langsamer.
http://www.dotnetperls.com/tuple-keyvaluepair
quelle