C# 7.0 har været ude i et stykke tid, og alle ved, at der findes en optimering for tupler i den nye funktion: ValueTuple. Her er detaljerede eksempler til at forklare Tuple VS ValueTuple på 10 minutter for bedre at forstå fordelene og brugen af ValueTuple.
Hvis du ved nok om Tuple, kan du springe afsnittet "Gennemgå Tuple" over og gå direkte til afsnittet "ValueTuple Explained" for at se den imponerende brug af værdi-tuples.
Se tilbage på Tuple
Tuple er en ny funktion, der kom med C# 4.0 og er tilgængelig i .Net Framework 4.0 og nyere.
En tuple er en datastruktur med et specifikt antal og en sekvens af elementer. For eksempel kan du designe en tredobbelt datastruktur til at gemme elevinformation, som indeholder i alt tre elementer: det første er navnet, det andet er alderen, og det tredje er højden.
De specifikke anvendelser af tupler er som følger:
1. Hvordan man opretter en tuple
Standard. Net-rammeværkTupler understøtter kun 1 til 7 tuple-elementerHvis der er 8 elementer eller flere, skal du bruge Tuples nesting- og Rest-egenskaber til at implementere det. Derudover tilbyder Tuple-klassen en statisk metode til at skabe tuple-objekter.
Opret tupler ved hjælp af konstruktører:
Konstruer tupler ved hjælp af Tuple statisk metode, der understøtter op til otte elementer:
Bemærk: Tuple-typen, der konstrueres her, er faktisk Tuple<int, int, int, int, Tuple<int>>, så datatypen opnået af testTuple8.Rest er Tuple<int>, så for at få den præcise værdi skal du tage Item1-egenskaben.
2. Repræsenterer et datasæt Opret en tuple nedenfor for at repræsentere tre oplysninger om en elev: navn, alder og højde, uden at oprette en ekstra klasse separat.
3. Returner flere værdier fra en metode Når en funktion skal returnere flere værdier, kan out-parameteren generelt bruges, og tupler kan bruges i stedet for out til at returnere flere værdier.
4. Multi-værdi overførsel for enkeltparametermetoder
Når funktionsparameteren kun er én objekttype, kan flere parameterværdier sendes ved hjælp af tuple-implementeringen.
På trods af de ovennævnte praktiske metoder har tupler også betydelige mangler:
- Når du tilgår elementer, kan du kun få adgang til dem via ItemX, og du skal præcisere rækkefølgen af elementerne før brug, og attributnavnene har ingen praktisk betydning, hvilket er besværligt at huske.
- Der er op til otte elementer, og hvis du vil have flere, kan du kun udvide ved at indlejre med det sidste element;
- Tuple er en referencetype, ikke en værditype som andre simple typer, som allokerer plads på heapen og kan have for meget oprettelse og allokering, når det er CPU-intensivt.
Derfor blev en ny ValueTuple-type introduceret i C# 7.0, som uddybes i de følgende afsnit.
ValueTuple forklarer det i detaljer
ValueTuple er en af de nye funktioner i C# 7.0, tilgængelig for .Net Framework 4.7 og nyere.
ValueTuple kræver ikke 4.7, så længe nuget er fint, 4.7 er indbygget. Derudover er ValueTuple en strukturtype, Microsoft anbefaler ikke at bruge strukturer over 64 bytes, hvilket også er effektivt for ValueTuple.
En værdituple er også en datastruktur, der bruges til at repræsentere et specifikt antal og en sekvens af elementer, men den adskiller sig fra en tupleklasse med følgende hovedforskelle:
En værdituple er en struktur, en værditype, ikke en klasse, mens en tuple er en klasse, en referencetype; Værditupleelementer er variable, ikke skrivebeskyttede, det vil sige, de kan ændre værdien af elementet i værdituplen; En værdituple af datamedlemmer er et felt, ikke en attribut. Den specifikke anvendelse af værditupler er som følger:
1. Hvordan man opretter en værdituple Ligesom tuple-klasser understøtter .Net Framework-værditupler kun 1 til 7 tuple-elementer, og hvis der er 8 elementer eller flere, skal du bruge de indlejrede og Rest-egenskaber for værdi-tupleen til at implementere det. Derudover kan ValueTuple-klassen tilbyde statiske metoder til oprettelse af værditupleobjekter.
Opret tupler ved hjælp af konstruktører:
Konstruer tupler ved hjælp af Tuple statisk metode, der understøtter op til otte elementer:
Bemærk, at Tuple-typen, der konstrueres her, faktisk er Tuple<int, int, <int>>, så datatypen opnået af testTuple8.Rest er Tuple<int>, så for at få den nøjagtige værdi skal du tage Item1-egenskaben.
Optimeringsforskelle:Når en tuple af værdier med mere end 7 elementer konstrueres, kan værdierne i den indlejrede tuple tilgås ved hjælp af følgende ItemX, og i eksemplet ovenfor for at få adgang til det tiende element, enten via testTuple10.Rest.Item3 eller testTuple10.Item10.
2. Repræsenterer et datasæt Opret en tuple af værdier, der repræsenterer tre oplysninger om en elev: navn, alder og højde uden at oprette en ekstra klasse separat.
3. Returner flere værdier fra en metode Værditupler kan også returnere flere værdier i stedet for out-parameteren i funktionsdefinitionen.
Optimeringsforskelle:Returværdien kan uforklarligt angives i ValueTuple ved at bruge en ny syntaks (,,) i stedet, såsom (streng, int, uint):
Fejlfinding af typen studentInfo er ValueType-triplet.
Optimeringsforskelle:Returværdien kan angive elementnavnet for at lette forståelsen af hukommelsestildeling og adgang:
Bekvem hukommelsestildeling:
4. Multi-værdi overførsel for enkeltparametermetoder Når en funktionsparameter kun er én objekttype, kan flere værdier sendes ved hjælp af værdituple-implementeringen.
5. Dekonstruer ValueTuple Du kan bruge var (x, y) eller (var x, var y) til at løse tuple-elementer til at konstruere lokale variable, mens du bruger symbolet "_" til at ignorere uønskede elementer.
Som nævnt ovenfor gør ValueTuple C# enklere og nemmere at bruge. De vigtigste fordele i forhold til Tuple er som følger:
- ValueTuple understøtter en ny syntaks for funktionsreturværdier" (,,)", hvilket gør koden enklere;
- Det skal bemærkes, at selvom det er navngivet, men værdituplen faktisk ikke definerer attributten eller feltet for et sådant navn, er det rigtige navn stadig ItemX, og alle elementnavne bruges kun under design og kompilering, ikke under kørsel (så vær opmærksom på serialiserings- og deserialiseringsoperationerne af denne type);
- Nogle eller alle tupler af elementer kan bruges mere bekvemt ved hjælp af destruktionsmetoder;
- Værditupler er værdityper, som er mere effektive at bruge end tupler af referencetyper, og værditupler har en sammenligningsmetode, der kan bruges til at sammenligne, om de er ens, se Detaljer:https://msdn.microsoft.com/en-us/library/system.valuetuple
|