C# 7.0 har funnits ute ett tag, och alla vet att det finns en optimering för tupler i den nya funktionen: ValueTuple. Här är detaljerade exempel för att förklara Tuple VS ValueTuple på 10 minuter för att bättre förstå fördelarna och användningen av ValueTuple.
Om du vet tillräckligt om Tuple kan du hoppa över avsnittet "Review Tuple" och gå direkt till avsnittet "ValueTuple Explained" för att se den bländande användningen av värdetupler.
Titta tillbaka på Tuple
Tuple är en ny funktion som kom med C# 4.0 och finns tillgänglig i .Net Framework 4.0 och uppåt.
En tuple är en datastruktur med ett specifikt antal och en följd av element. Till exempel, designa en trippeldatastruktur för att lagra studentinformation, som innehåller totalt tre element: det första är namnet, det andra är åldern och det tredje är längden.
De specifika användningsområdena för tupler är följande:
1. Hur man skapar en tuple
Standard. Net FrameworkTupler stöder endast 1 till 7 tupleelementOm det finns 8 element eller fler behöver du använda Tuples nesting och Rest-egenskaper för att implementera det. Dessutom tillhandahåller Tuple-klassen en statisk metod för att skapa tupleobjekt.
Skapa tupler med konstruktörer:
Konstruera tupler med Tuple-statisk metod, som stöder upp till åtta element:
Notera: Tuple-typen som konstrueras här är faktiskt Tuple<int, int, int, int, Tuple<int>>, så datatypen som erhålls av testTuple8.Rest är Tuple<int>, så för att få det exakta värdet måste du ta Item1-egenskapen.
2. Representerar en datamängd Skapa en tuple nedan för att representera tre uppgifter om en elev: namn, ålder och längd, utan att skapa en separat klass.
3. Returnera flera värden från en metod När en funktion behöver returnera flera värden kan out-parametern vanligtvis användas, och tupler kan användas istället för out för att returnera flera värden.
4. Multivärdesöverföring för metoder med en enda parameter
När funktionsparametern endast är en objekttyp kan flera parametervärden skickas med hjälp av tuple-implementationen.
Trots de ovan nämnda praktiska metoderna har tupler också betydande brister:
- När du får tillgång till element kan du bara komma åt dem via ItemX, och du behöver klargöra ordningen på elementen innan användning, och attributnamnen har ingen praktisk betydelse, vilket är besvärligt att komma ihåg.
- Det finns upp till åtta element, och om du vill ha fler kan du bara expandera genom att bädda med det sista elementet;
- Tuple är en referenstyp, inte en värdetyp som andra enkla typer, som allokerar utrymme på heapen och kan kräva för mycket skapande och allokering när det är CPU-intensivt.
Därför introducerades en ny ValueTuple-typ i C# 7.0, som beskrivs i följande avsnitt.
ValueTuple förklarar i detalj
ValueTuple är en av de nya funktionerna i C# 7.0, tillgänglig för .Net Framework 4.7 och uppåt.
ValueTuple kräver inte 4.7, så länge nuget är okej, 4.7 är inbyggt. Dessutom är ValueTuple en strukturtyp, Microsoft rekommenderar att man inte använder strukturer över 64 byte, vilket också är effektivt för ValueTuple.
En värdetuple är också en datastruktur som används för att representera ett specifikt antal och en sekvens av element, men den skiljer sig från en tupleklass, med följande huvudsakliga skillnader:
En värdetuple är en struktur, en värdetyp, inte en klass, medan en tuple är en klass, en referenstyp; Värdetuplelement är variabla och inte skrivskyddade, det vill säga de kan ändra värdet på elementet i värdetuplen; En värdetuple av datamedlemmar är ett fält, inte ett attribut. Den specifika användningen av värdetupler är följande:
1. Hur man skapar en värdetuple Precis som tupleklasser stöder .Net Framework-värdetupler bara 1 till 7 tuple-element, och om det finns 8 eller fler element behöver du använda de nästlade och Rest-egenskaperna för värdetuplen för att implementera det. Dessutom kan ValueTuple-klassen tillhandahålla statiska metoder för att skapa värdetupleobjekt.
Skapa tupler med konstruktörer:
Konstruera tupler med Tuple-statisk metod, som stöder upp till åtta element:
Observera att Tuple-typen som konstrueras här faktiskt är Tuple<int, int, <int>>, så datatypen som erhålls av testTuple8.Rest är Tuple<int>, så för att få det korrekta värdet måste du ta Item1-egenskapen.
Optimeringsskillnad:När en tuple av värden med fler än 7 element konstrueras kan värdena i den nästlade tuplen nås med följande ItemX, och för exemplet ovan för att komma åt det tionde elementet, antingen via testTuple10.Rest.Item3 eller testTuple10.Item10.
2. Representerar en datamängd Skapa en tuple av värden för att representera tre informationsbitar om en elev: namn, ålder och längd utan att skapa en separat klass.
3. Returnera flera värden från en metod Värdetupler kan också returnera flera värden istället för utparametern i funktionsdefinitionen.
Optimeringsskillnad:Returvärdet kan specificeras i ValueTuple oförklarligt, med hjälp av en ny syntax (,,) istället, såsom (sträng, int, uint):
Att felsöka typen av studentInfo är ValueType-trippelen.
Optimeringsskillnad:Returvärdet kan specificera elementets namn för att underlätta förståelsen av minnestilldelning och åtkomst:
Bekväm minnestilldelning:
4. Multivärdesöverföring för metoder med en enda parameter När en funktionsparameter endast är en objekttyp kan flera värden skickas med hjälp av värdetuple-implementationen.
5. Dekonstruera värdetuplen Du kan använda var (x, y) eller (var x, var y) för att lösa tuple-element för att konstruera lokala variabler, samtidigt som du använder symbolen "_" för att ignorera oönskade element.
Som nämnts ovan gör ValueTuple C# enklare och lättare att använda. De främsta fördelarna jämfört med Tuple är följande:
- ValueTuple stöder en ny syntax för funktionsreturnvärden" (,,)", vilket gör koden enklare;
- Det bör noteras här att även om det är namngivet, så definierar värdetupeln faktiskt inte attributet eller fältet för ett sådant namn, så är det riktiga namnet fortfarande ItemX, och alla elementnamn används endast under design och kompilering, inte under körning (så var uppmärksam på serialiserings- och deserialiseringsoperationerna av denna typ);
- Vissa eller alla tupler av element kan användas mer bekvämt med destruktionsmetoder;
- Värdetupler är värdetyper, som är mer effektiva att använda än tupler av referenstyper, och värdetupler har en jämförelsemetod som kan användas för att jämföra om de är lika, se Detaljer:https://msdn.microsoft.com/en-us/library/system.valuetuple
|