C# 7.0 je už nejaký čas dostupný a všetci vedia, že nová funkcia: ValueTuple, ponúka optimalizáciu pre n-tice. Tu sú podrobné príklady na vysvetlenie Tuple VS ValueTuple za 10 minút, aby ste lepšie pochopili výhody a využitie ValueTuple.
Ak o n-tice viete dosť, môžete preskočiť sekciu "Preskúmať n-ticu" a ísť rovno do sekcie "ValueTuple Explained", kde vidíte ohromujúce využitie hodnotových n-tic.
Pozrite sa späť na Tuple
N-tica je nová funkcia, ktorá vyšla s C# 4.0 a je dostupná v .Net Framework 4.0 a vyšších.
N-tica je dátová štruktúra s konkrétnym počtom a postupnosťou prvkov. Napríklad navrhnite trojitú dátovú štruktúru na uloženie informácií o študentovi, ktorá obsahuje celkovo tri prvky: prvý je meno, druhý vek a tretí výška.
Konkrétne použitia n-tic sú nasledovné:
1. Ako vytvoriť n-ticu
Predvolené. Net FrameworkN-tice podporujú iba 1 až 7 prvkov n-ticAk je 8 prvkov alebo viac, musíte použiť vlastnosti vnorenia a odpočinku n-tice na jeho implementáciu. Okrem toho trieda n-tic poskytuje statickú metódu na vytváranie objektov n-tic.
Vytvárajte n-tice pomocou konštruktorov:
Konštruujte n-tice pomocou statickej metódy n-tic, ktoré podporujú až osem prvkov:
Poznámka: Typ n-tice vytvorený tu je v skutočnosti Tuple<int, int, int, int, Tuple<int>>, takže dátový typ získaný testTuple8.Rest je Tuple<int>, takže na získanie presnej hodnoty je vlastnosť Item1.
2. Predstavuje množinu dát Nižšie vytvorte n-ticu, ktorá bude reprezentovať tri informácie o študentovi: meno, vek a výšku, bez samostatného vytvárania ďalšej triedy.
3. Vráťte viacero hodnôt z metódy Keď funkcia potrebuje vrátiť viacero hodnôt, zvyčajne sa dá použiť parameter out a namiesto out sa môžu použiť n-tice na vrátenie viacerých hodnôt.
4. Prenos viacerých hodnôt pre metódy s jedným parametrom
Keď je parameter funkcie len jeden typ objektu, pomocou implementácie n-tice je možné odovzdať viacero hodnôt parametrov.
Napriek vyššie spomenutým praktickým metódam majú n-tice aj významné nedostatky:
- Pri prístupe k prvkom k nim môžete pristupovať iba cez ItemX a pred použitím musíte upresniť poradie prvkov, pričom názvy atribútov nemajú praktický význam, čo je nepríjemné na zapamätanie.
- Existuje až osem prvkov a ak chcete viac, môžete sa rozšíriť len vnorením s posledným prvkom;
- N-tica je referenčný typ, nie typ hodnoty ako iné jednoduché typy, ktoré prideľujú miesto na halde a môžu mať príliš veľa práce na tvorbe a prideľovanie, keď sú náročné na CPU.
Preto bol v C# 7.0 zavedený nový typ ValueTuple, ktorý je podrobne opísaný v nasledujúcich častiach.
ValueTuple to podrobne vysvetľuje
ValueTuple je jednou z nových funkcií C# 7.0, dostupnou pre .Net Framework 4.7 a vyššie.
ValueTuple nevyžaduje 4.7, pokiaľ je nuget v poriadku, 4.7 je zabudovaný. Okrem toho je ValueTuple typ štruktúry, Microsoft odporúča nepoužívať štruktúry nad 64 bajtov, čo je účinné aj pre ValueTuple.
N-tica hodnôt je tiež dátová štruktúra používaná na reprezentáciu konkrétneho počtu a postupnosti prvkov, ale líši sa od triedy n-tic s nasledujúcimi hlavnými rozdielmi:
N-tica hodnôt je štruktúra, typ hodnoty, nie trieda, zatiaľ čo n-tica je trieda, referenčný typ; Prvky n-ticy sú variabilné, nie len na čítanie, teda môžu meniť hodnotu prvku v n-tici; Hodnotová n-tica dátových členov je pole, nie atribút. Konkrétne použitie hodnotových n-tic je nasledovné:
1. Ako vytvoriť hodnotovú n-ticu Rovnako ako triedy n-tic, n-tice hodnôt .Net Framework podporujú len 1 až 7 prvkov n-tic, a ak je ich 8 alebo viac, musíte použiť vnorené a Rest vlastnosti n-tice hodnoty na ich implementáciu. Okrem toho trieda ValueTuple môže poskytovať statické metódy na vytváranie objektov hodnotových n-tic.
Vytvárajte n-tice pomocou konštruktorov:
Konštruujte n-tice pomocou statickej metódy n-tic, ktoré podporujú až osem prvkov:
Upozorňujeme, že typ n-tice vytvorený tu je v skutočnosti Tuple<int, int, <int>>, takže dátový typ získaný testTuple8.Rest je Tuple<int>, takže na získanie presnej hodnoty je vlastnosť Item1.
Rozdiel v optimalizácii:Keď sa vytvorí n-tica hodnôt s viac ako 7 prvkami, hodnoty v vnorenej n-tice sú prístupné pomocou nasledujúcej položky X a v prípade vyššie uvedeného aj na prístup k desiatemu prvku, buď cez testTuple10.Rest.Item3 alebo testTuple10.Item10.
2. Predstavuje množinu dát Vytvorte n-ticu hodnôt, ktorá bude reprezentovať tri informácie o študentovi: meno, vek a výšku bez samostatného vytvárania ďalšej triedy.
3. Vráťte viacero hodnôt z metódy N-tice hodnôt môžu tiež vracať viacero hodnôt namiesto parametra výstupu v definícii funkcie.
Rozdiel v optimalizácii:Vrátená hodnota môže byť v ValueTuple nevysvetliteľne špecifikovaná pomocou novej syntaxe (,,), napríklad (string, int, uint):
Ladenie typu studentInfo je trojica ValueType.
Rozdiel v optimalizácii:Vrátená hodnota môže špecifikovať názov prvku, aby sa uľahčilo pochopenie priradenia a prístupu k pamäti:
Pohodlné priradenie pamäte:
4. Prenos viacerých hodnôt pre metódy s jedným parametrom Keď je parameter funkcie iba jedným typom objektu, pomocou implementácie n-tice je možné odovzdať viacero hodnôt.
5. Dekonštruujte hodnotovú ticu Môžete použiť var (x, y) alebo (var x, var y) na vyriešenie prvkov n-tice na vytvorenie lokálnych premenných, pričom symbol "_" môžete použiť na ignorovanie nežiaducich prvkov.
Ako už bolo spomenuté vyššie, ValueTuple robí C# jednoduchším a jednoduchším na používanie. Hlavné výhody oproti n-tice sú nasledovné:
- ValueTuple podporuje novú syntax pre hodnoty vrátených funkcií" (,,)", čím sa kód zjednodušuje;
- Treba poznamenať, že hoci je hra pomenovaná, v skutočnosti n-tica nedefinuje atribút alebo pole takéhoto názvu, skutočný názov je stále ItemX a všetky názvy prvkov sa používajú len počas návrhu a kompilácie, nie za behu (preto venujte pozornosť operáciám serializácie a deserializácie tohto typu);
- Niektoré alebo všetky n-tice prvkov sa dajú pohodlnejšie použiť pomocou metód destrukcie;
- Hodnotové n-tice sú typy hodnôt, ktoré sú efektívnejšie na použitie než n-tice referenčných typov, a hodnotové n-tice majú metódu porovnania, ktorá umožňuje porovnať, či sú rovnaké, pozri Detaily:https://msdn.microsoft.com/en-us/library/system.valuetuple
|