C# 7.0 a apărut de ceva vreme, iar toată lumea știe că există o optimizare pentru tuple-uri în noua funcționalitate: ValueTuple. Iată exemple detaliate pentru a explica Tuple VS ValueTuple în 10 minute, pentru a înțelege mai bine beneficiile și utilizarea ValueTuple.
Dacă știi suficient despre Tuple, poți sări peste secțiunea "Revizuire Tuple" și să mergi direct la secțiunea "ValueTuple Explicat" pentru a vedea utilizarea uluitoare a tuple-urilor value.
Privește înapoi la Tuple
Tuple este o funcționalitate nouă care a apărut odată cu C# 4.0 și este disponibilă în .Net Framework 4.0 și versiuni.
Un tuple este o structură de date cu un număr și o secvență specifice de elemente. De exemplu, proiectează o structură triplă de date pentru a stoca informațiile elevilor, care conține în total trei elemente: primul este numele, al doilea este vârsta, iar al treilea este înălțimea.
Utilizările specifice ale tuplelor sunt următoarele:
1. Cum să creezi un tuple
Implicit. Cadrul NetTuplele suportă doar 1 până la 7 elemente de tupleDacă există 8 sau mai multe elemente, trebuie să folosești proprietățile de imbricare și Rest ale Tuple-ului pentru a o implementa. În plus, clasa Tuple oferă o metodă statică pentru crearea obiectelor tuple.
Creează tuple-uri folosind constructori:
Construiți tuple-uri folosind metoda statică a Tuple-ului, susținând până la opt elemente:
Notă: Tipul de Tuple construit aici este de fapt Tuple<int, int, int, int, Tuple<int>>, deci tipul de date obținut de testTuple8.Rest este Tuple<int>, deci pentru a obține valoarea exactă, trebuie să iei proprietatea Item1.
2. Reprezintă un set de date Creează un tuple mai jos pentru a reprezenta trei informații despre un elev: nume, vârstă și înălțime, fără a crea separat o clasă suplimentară.
3. Returnarea mai multor valori dintr-o metodă Când o funcție trebuie să returneze mai multe valori, parametrul out poate fi folosit în general, iar tuplele pot fi folosite în loc de out pentru a returna mai multe valori.
4. Transfer multi-valoare pentru metode cu un singur parametru
Când parametrul funcției este un singur tip de obiect, pot fi transmise mai multe valori ale parametrilor folosind implementarea tuple-ului.
În ciuda metodelor practice menționate mai sus, tuplele au și limituri semnificative:
- Când accesezi elemente, le poți accesa doar prin ItemX și trebuie să clarifici ordinea elementelor înainte de utilizare, iar numele atributelor nu au nicio semnificație practică, ceea ce este incomod de reținut.
- Există până la opt elemente, iar dacă vrei mai multe, poți extinde doar prin îmbarcare cu ultimul element;
- Tuple-ul este un tip de referință, nu un tip de valoare ca alte tipuri simple, care alocă spațiu pe heap și poate necesita prea multă muncă de creare și alocare când este intensiv pentru CPU.
Prin urmare, un nou tip ValueTuple a fost introdus în C# 7.0, detaliat în secțiunile următoare.
ValueTuple explică în detaliu
ValueTuple este una dintre noile funcționalități ale C# 7.0, disponibilă pentru .Net Framework 4.7 și versiuni.
ValueTuple nu necesită 4.7, atâta timp cât Nuget este în regulă, 4.7 este integrat. În plus, ValueTuple este un tip de structură, Microsoft recomandă să nu se folosească structuri peste 64 de octeți, ceea ce este de asemenea eficient pentru ValueTuple.
Un tuple de valoare este, de asemenea, o structură de date folosită pentru a reprezenta un număr și o secvență specifică de elemente, dar este diferită de o clasă de tuple, cu următoarele diferențe principale:
Un tuplu de valoare este o structură, un tip de valoare, nu o clasă, în timp ce un tuple este o clasă, un tip de referință; Elementele tuple-valoare sunt variabile, nu doar pentru citire, adică pot schimba valoarea elementului din tuple-ul de valoare; Un tuplu de valoare al membrilor datelor este un câmp, nu un atribut. Utilizarea specifică a tuplelor de valoare este următoarea:
1. Cum să creezi un tuple de valoare La fel ca clasele de tuple, tuplele de valoare din .Net Framework suportă doar între 1 și 7 elemente de tuple, iar dacă există 8 sau mai multe elemente, trebuie să folosești proprietățile nested și rest ale tuple-ului de valoare pentru a implementa acest lucru. În plus, clasa ValueTuple poate oferi metode statice pentru crearea obiectelor tuple de valoare.
Creează tuple-uri folosind constructori:
Construiți tuple-uri folosind metoda statică a Tuple-ului, susținând până la opt elemente:
Rețineți că tipul de Tuple construit aici este de fapt Tuple<int, int, <int>>, deci tipul de date obținut de testTuple8.Rest este Tuple<int>, deci pentru a obține valoarea exactă, trebuie să luați proprietatea Item1.
Diferența de optimizare:Când se construiește un tuple de valori cu mai mult de 7 elemente, valorile din tuplea imbricată pot fi accesate folosind următorul ItemX și, pentru exemplul de mai sus, pentru a accesa al zecelea element, fie prin testTuple10.Rest.Item3, fie prin testTuple10.Item10.
2. Reprezintă un set de date Creează un tuple de valori care să reprezinte trei informații despre un elev: nume, vârstă și înălțime, fără a crea separat o clasă suplimentară.
3. Returnarea mai multor valori dintr-o metodă Tuplele de valori pot returna și mai multe valori în locul parametrului out din definiția funcției.
Diferența de optimizare:Valoarea returnării poate fi specificată inexplicabil în ValueTuple, folosind o nouă sintaxă (,,), cum ar fi (string, int, uint):
Depanarea tipului de studentInfo este tripletul ValueType.
Diferența de optimizare:Valoarea returnată poate specifica numele elementului pentru a facilita înțelegerea atribuirii memoriei și accesului:
Atribuire convenabilă a memoriei:
4. Transfer multi-valoare pentru metode cu un singur parametru Când un parametru de funcție este un singur tip de Obiect, pot fi transmise mai multe valori folosind implementarea tuple-ului de valori.
5. Deconstruirea valuetuple-ului Poți folosi var (x, y) sau (var x, var y) pentru a rezolva elementele tuple pentru a construi variabile locale, folosind în același timp simbolul "_" pentru a ignora elementele nedorite.
După cum am menționat mai sus, ValueTuple face C# mai simplu și mai ușor de folosit. Principalele avantaje față de Tuple sunt următoarele:
- ValueTuple suportă o nouă sintaxă pentru valorile de returnare a funcțiilor" (,,)", făcând codul mai simplu;
- Trebuie menționat aici că, deși este denumit, de fapt tuple-ul de valoare nu definește atributul sau câmpul unui astfel de nume, numele real este tot ItemX, iar toate numele elementelor sunt folosite doar în timpul proiectării și compilației, nu la rulare (așadar, atenție la operațiunile de serializare și deserializare de acest tip);
- Unele sau toate tuplele de elemente pot fi folosite mai convenabil folosind metode de distrugere;
- Tuplele de valoare sunt tipuri de valoare, care sunt mai eficiente de utilizat decât tuplele de tipuri de referință, iar tuplele de valoare au o metodă de comparație care poate fi folosită pentru a compara dacă sunt egale, vezi Detalii:https://msdn.microsoft.com/en-us/library/system.valuetuple
|