C# 7.0 jau kurį laiką buvo išleistas, ir visi žino, kad naujoje funkcijoje yra optimizavimas tupeliams: ValueTuple. Štai išsamūs pavyzdžiai, paaiškinantys Tuple VS ValueTuple per 10 minučių, kad geriau suprastumėte ValueTuple naudą ir naudojimą.
Jei pakankamai žinote apie Tuple, galite praleisti skyrių "Review Tuple" ir eiti tiesiai į skyrių "ValueTuple Paaiškinta", kad pamatytumėte akinantį vertės tuples naudojimą.
Pažvelkite atgal į Tuple
"Tuple" yra nauja funkcija, kuri pasirodė su C# 4.0 ir yra prieinama .Net Framework 4.0 ir naujesnėse versijose.
Tupelis yra duomenų struktūra su tam tikru elementų skaičiumi ir seka. Pavyzdžiui, sukurkite trigubą duomenų struktūrą studentų informacijai saugoti, kurioje iš viso yra trys elementai: pirmasis yra vardas, antrasis - amžius, o trečias - ūgis.
Konkretūs tuplių naudojimo būdai yra šie:
1. Kaip sukurti tupelį
Numatytasis. Grynasis karkasasTuples palaiko tik nuo 1 iki 7 tuple elementųJei yra 8 ar daugiau elementų, turite naudoti Tuple lizdų ir poilsio ypatybes, kad jį įgyvendintumėte. Be to, Tuple klasė suteikia statinį tuple objektų kūrimo metodą.
Sukurkite tuples naudodami konstruktorius:
Sukonstruokite tuples naudodami statinį "Tuple" metodą, palaikydami iki aštuonių elementų:
Pastaba: Čia sukonstruotas Tuple tipas iš tikrųjų yra Tuple<int, int, int, int, Tuple<int>>, todėl duomenų tipas, gautas testTuple8.Rest, yra Tuple<int>, todėl norint gauti tikslią reikšmę, reikia paimti ypatybę Item1.
2. Atspindi duomenų rinkinį Žemiau sukurkite rinkinį, kuris parodytų tris informacijos apie mokinį dalis: vardą, amžių ir ūgį, atskirai nesukurdami papildomos klasės.
3. Grąžinkite kelias metodo reikšmes Kai funkcijai reikia grąžinti kelias reikšmes, paprastai galima naudoti parametrą out, o vietoj out galima naudoti tuples kelioms reikšmėms grąžinti.
4. Kelių reikšmių perdavimas vieno parametro metodams
Kai funkcijos parametras yra tik vienas objekto tipas, naudojant tuple diegimą galima perduoti kelias parametrų reikšmes.
Nepaisant aukščiau paminėtų patogių metodų, tupeliai taip pat turi didelių trūkumų:
- Pasiekdami elementus, juos galite pasiekti tik per "ItemX", o prieš naudojimą turite išsiaiškinti elementų tvarką, o atributų pavadinimai neturi praktinės reikšmės, kurią nepatogu atsiminti.
- Yra iki aštuonių elementų, o jei norite daugiau, galite išplėsti tik įdėdami paskutinį elementą;
- Tuple yra nuorodos tipas, o ne reikšmių tipas, kaip kiti paprasti tipai, kuris paskirsto vietą krūvoje ir gali turėti per daug kūrimo ir paskirstymo darbo, kai procesorius intensyvus.
Todėl C# 7.0 buvo pristatytas naujas ValueTuple tipas, kuris išsamiai aprašytas tolesniuose skyriuose.
ValueTuple išsamiai paaiškina
ValueTuple yra viena iš naujų C# 7.0 funkcijų, prieinamų .Net Framework 4.7 ir naujesnėms versijoms.
ValueTuple nereikalauja 4.7, kol nuget yra gerai, 4.7 yra įmontuotas. Be to, "ValueTuple" yra struktūros tipas, "Microsoft" rekomenduoja nenaudoti didesnių nei 64 baitų struktūrų, o tai taip pat veiksminga "ValueTuple".
Reikšmių rinkinys taip pat yra duomenų struktūra, naudojama konkrečiam elementų skaičiui ir sekai pavaizduoti, tačiau ji skiriasi nuo tuplių klasės, turinti šiuos pagrindinius skirtumus:
Reikšmių rinkinys yra struktūra, reikšmės tipas, o ne klasė, o tupelis yra klasė, nuorodos tipas; Vertės tupel elementai yra kintami, ne tik skaitomi, tai yra, jie gali pakeisti elemento reikšmę vertės tuple; Duomenų narių reikšmių rinkinys yra laukas, o ne atributas. Konkretus reikšmių tuplių naudojimas yra toks:
1. Kaip sukurti vertės tupelį Kaip ir tuple klasės, .Net Framework reikšmių tupeliai palaiko tik nuo 1 iki 7 tuple elementų, o jei yra 8 ar daugiau elementų, turite naudoti įdėtąsias ir Rest reikšmių tuple ypatybes. Be to, ValueTuple klasė gali pateikti statinius vertės tuple objektų kūrimo metodus.
Sukurkite tuples naudodami konstruktorius:
Sukonstruokite tuples naudodami statinį "Tuple" metodą, palaikydami iki aštuonių elementų:
Atkreipkite dėmesį, kad čia sukonstruotas Tuple tipas iš tikrųjų yra Tuple<int, int, <int>>, todėl duomenų tipas, gautas testTuple8.Rest, yra Tuple<int>, todėl norint gauti tikslią reikšmę, reikia paimti ypatybę Item1.
Optimizavimo skirtumas:Kai sukonstruojamas reikšmių rinkinys, turintis daugiau nei 7 elementus, įdėtojo rinkinio reikšmes galima pasiekti naudojant šį ItemX, o aukščiau pateiktame pavyzdyje - pasiekti dešimtąjį elementą per testTuple10.Rest.Item3 arba testTuple10.Item10.
2. Atspindi duomenų rinkinį Sukurkite reikšmių rinkinį, kad nurodytumėte tris informacijos apie mokinį dalis: vardą, amžių ir ūgį, atskirai nekurdami papildomos klasės.
3. Grąžinkite kelias metodo reikšmes Reikšmių tupeliai taip pat gali grąžinti kelias reikšmes vietoj parametro out funkcijos apibrėžime.
Optimizavimo skirtumas:Grąžinama reikšmė gali būti nepaaiškinamai nurodyta ValueTuple, naudojant naują sintaksę (,,), pvz., (string, int, uint):
Derinant studentInfo tipą yra ValueType tripletas.
Optimizavimo skirtumas:Grąžinama reikšmė gali nurodyti elemento pavadinimą, kad būtų lengviau suprasti atminties priskyrimą ir prieigą:
Patogus atminties priskyrimas:
4. Kelių reikšmių perdavimas vieno parametro metodams Kai funkcijos parametras yra tik vienas objekto tipas, naudojant reikšmės tuple diegimą galima perduoti kelias reikšmes.
5. Dekonstruokite ValueTuple Galite naudoti var (x, y) arba (var x, var y), kad išspręstumėte tupel elementus, kad sukurtumėte vietinius kintamuosius, o naudodami simbolį "_", kad nepaisytumėte nepageidaujamų elementų.
Kaip minėta aukščiau, "ValueTuple" daro C# paprastesnį ir lengviau naudojamą. Pagrindiniai pranašumai, palyginti su "Tuple", yra šie:
- ValueTuple palaiko naują sintaksę funkcijos grąžinamos reikšmės" (,,)", todėl kodas yra paprastesnis;
- Čia reikėtų pažymėti, kad nors jis ir pavadintas, tačiau iš tikrųjų reikšmės tupelis neapibrėžia tokio pavadinimo atributo ar lauko, tikrasis vardas vis tiek yra ItemX, o visi elementų pavadinimai naudojami tik projektuojant ir kompiliuojant, o ne vykdymo metu (todėl atkreipkite dėmesį į tokio tipo serializavimo ir deserializavimo operacijas);
- Kai kuriuos ar visus elementų tuples galima patogiau naudoti naudojant naikinimo metodus;
- Reikšmių tupeliai yra reikšmių tipai, kuriuos naudoti efektyviau nei nuorodų tipų rinkinius, o reikšmių tupeliai turi palyginimo metodą, kurį galima naudoti norint palyginti, ar jie yra vienodi, žr.https://msdn.microsoft.com/en-us/library/system.valuetuple
|