C# 7.0 ist schon eine Weile erhältlich, und jeder weiß, dass es in der neuen Funktion ValueTuple eine Optimierung für Tupel gibt. Hier sind detaillierte Beispiele, um Tuple VS ValueTuple in 10 Minuten zu erklären, um die Vorteile und Nutzung von ValueTuple besser zu verstehen.
Wenn du genug über Tuple weißt, kannst du den Abschnitt "Tuple bewerten" überspringen und direkt zum Abschnitt "ValueTuple erklärt" gehen, um die beeindruckende Nutzung von Value-Tupeln zu sehen.
Schau zurück auf Tuple
Tuple ist eine neue Funktion, die mit C# 4.0 erschienen ist und ab .Net Framework 4.0 verfügbar ist.
Ein Tupel ist eine Datenstruktur mit einer bestimmten Anzahl und Folge von Elementen. Entwerfen Sie zum Beispiel eine dreifache Datenstruktur zur Speicherung von Schülerinformationen, die insgesamt drei Elemente enthält: Das erste ist der Name, das zweite das Alter und das dritte die Größe.
Die spezifischen Verwendungen von Tupeln sind wie folgt:
1. Wie man ein Tupel erstellt
Standard. Net FrameworkTupel unterstützen nur 1 bis 7 TupelelementeWenn es 8 oder mehr Elemente gibt, musst du die Nesting- und Rest-Eigenschaften von Tuple verwenden, um das zu implementieren. Zusätzlich bietet die Tuple-Klasse eine statische Methode zur Erstellung von Tuple-Objekten.
Erstelle Tupel mit Konstruktoren:
Stellen Sie Tupel mit der statischen Tuple-Methode auf, die bis zu acht Elemente unterstützt:
Hinweis: Der hier konstruierte Tuple-Typ ist tatsächlich Tuple<int, int, int, int, Tuple<int>>, daher ist der von testTuple8.Rest erhaltene Datentyp Tuple, <int>daher muss man für den genauen Wert die Item1-Eigenschaft nehmen.
2. Repräsentiert einen Datensatz Erstellen Sie unten ein Tupel, das drei Informationen über einen Schüler darstellt: Name, Alter und Größe, ohne eine zusätzliche Klasse separat zu erstellen.
3. Geben Sie mehrere Werte aus einer Methode zurück Wenn eine Funktion mehrere Werte zurückgeben muss, kann der Out-Parameter in der Regel verwendet werden, und Tupel können anstelle von Out verwendet werden, um mehrere Werte zurückzugeben.
4. Mehrwertübertragung für Einzelparameter-Methoden
Wenn der Funktionsparameter nur ein Objekttyp ist, können mehrere Parameterwerte mithilfe der Tupel-Implementierung übermittelt werden.
Trotz der oben genannten praktischen Methoden haben Tupel auch erhebliche Schwächen:
- Beim Zugriff auf Elemente kann man sie nur über ItemX erreichen, und man muss die Reihenfolge der Elemente vor der Nutzung klarstellen, und die Attributnamen haben keine praktische Bedeutung, was unpraktisch zu merken ist.
- Es gibt bis zu acht Elemente, und wenn du mehr möchtest, kannst du nur erweitern, indem du mit dem letzten Element verschachtelst;
- Tuple ist ein Referenztyp, kein Werttyp wie andere einfache Typen, der Speicherplatz auf dem Heap zuweist und bei CPU-intensiver Belastung zu viel Erstellung und Zuweisung verursachen kann.
Daher wurde in C# 7.0 ein neuer ValueTuple-Typ eingeführt, der in den folgenden Abschnitten detailliert ausgeführt wird.
ValueTuple erklärt das ausführlich
ValueTuple ist eine der neuen Funktionen von C# 7.0, verfügbar für .Net Framework 4.7 und höher.
ValueTuple benötigt keine 4.7, solange Nuget in Ordnung ist, ist 4.7 integriert. Außerdem ist ValueTuple ein Strukturtyp, Microsoft empfiehlt, keine Strukturen über 64 Bytes zu verwenden, was auch für ValueTuple effektiv ist.
Ein Werttupel ist ebenfalls eine Datenstruktur, die verwendet wird, um eine bestimmte Anzahl und Folge von Elementen darzustellen, unterscheidet sich jedoch von einer Tupelklasse und weist folgende Hauptunterschiede auf:
Ein Werttupel ist eine Struktur, ein Werttyp, keine Klasse, während ein Tupel eine Klasse, ein Referenztyp, ist; Werttupelelemente sind variabel, nicht nur lesebar, das heißt, sie können den Wert des Elements im Werttupel verändern; Ein Werttupel von Datenmitgliedern ist ein Feld, kein Attribut. Die spezifische Verwendung von Werttupeln ist wie folgt:
1. Wie man ein Werttupel erstellt Wie Tuple-Klassen unterstützen .Net Framework-Wert-Tupel nur 1 bis 7 Tupel-Elemente, und wenn es 8 oder mehr Elemente gibt, muss man die verschachtelten und Rest-Eigenschaften des Wert-Tupels verwenden, um es zu implementieren. Zusätzlich kann die ValueTuple-Klasse statische Methoden zur Erstellung von Werttupel-Objekten bereitstellen.
Erstelle Tupel mit Konstruktoren:
Stellen Sie Tupel mit der statischen Tuple-Methode auf, die bis zu acht Elemente unterstützt:
Beachte, dass der hier konstruierte Tuple<Typ tatsächlich Tupleint, int, <int>> ist, sodass der von testTuple8.Rest erhaltene Datentyp Tuple ist<int>, daher musst du für den genauen Wert die Item1-Eigenschaft verwenden.
Optimierungsunterschied:Wenn ein Tupel von Werten mit mehr als 7 Elementen konstruiert wird, können die Werte im verschachtelten Tupel mit folgendem ItemX und im obigen Beispiel auf das zehnte Element entweder über testTuple10.Rest.Item3 oder testTuple10.Item10 zugreifen.
2. Repräsentiert einen Datensatz Erstellen Sie ein Tupel von Werten, um drei Informationen über einen Schüler darzustellen: Name, Alter und Körpergröße, ohne eine separate Klasse zu erstellen.
3. Geben Sie mehrere Werte aus einer Methode zurück Werttupel können in der Funktionsdefinition auch mehrere Werte anstelle des Out-Parameters zurückgeben.
Optimierungsunterschied:Der Rückgabewert kann im ValueTuple unerklärlicherweise angegeben werden, indem stattdessen eine neue Syntax (,,) verwendet wird, wie zum Beispiel (String, int, uint):
Das Debuggen des Typs von studentInfo ist das ValueType-Triplet.
Optimierungsunterschied:Der Rückgabewert kann den Elementnamen angeben, um das Verständnis der Speicherzuweisung und des Zugriffs zu erleichtern:
Bequeme Speicherzuweisung:
4. Mehrwertübertragung für Einzelparameter-Methoden Wenn ein Funktionsparameter nur ein Objekttyp ist, können mehrere Werte mittels der Werttupel-Implementierung übergeben werden.
5. Dekonstruiere das ValueTuple Man kann var (x, y) oder (var x, var y) verwenden, um Tupelelemente aufzulösen und lokale Variablen zu konstruieren, während das Symbol "_" verwendet wird, um unerwünschte Elemente zu ignorieren.
Wie oben erwähnt, macht ValueTuple C# einfacher und benutzerfreundlicher. Die Hauptvorteile gegenüber Tuple sind folgende:
- ValueTuple unterstützt eine neue Syntax für Funktionsrückgabewerte" (,,)", wodurch der Code einfacher wird;
- Es sollte hier beachtet werden, dass es zwar benannt ist, aber das Werttupel tatsächlich nicht das Attribut oder Feld eines solchen Namens definiert, der echte Name dennoch ItemX ist und alle Elementnamen nur während des Entwurfs und der Kompilierung verwendet werden, nicht zur Laufzeit (achten Sie also auf die Serialisierungs- und Deserialisierungsoperationen dieses Typs);
- Einige oder alle Tupel von Elementen können mit Zerstörungsmethoden bequemer verwendet werden;
- Werttupel sind Werttypen, die effizienter zu verwenden sind als Tupel von Referenztypen, und Werttupel verfügen über eine Vergleichsmethode, mit der man vergleichen kann, ob sie gleich sind, siehe Details:https://msdn.microsoft.com/en-us/library/system.valuetuple
|