Dua të filloj duke përmendur se C# tashmë kishte mbështetje për lloje anonime. Cilat janë llojet e referencës. Kështu, ju tashmë kishit një alternativë të përshtatshme për të krijuar një klasë të emërtuar.
Një avantazh i një klase të emërtuar është se do të jetë më e lehtë për t'u ripërdorur (për shembull nëse ju nevojitet i njëjti lloj në shumë vende) dhe dokumentimi. Meqenëse lloji anonim është anonim, ju mund të merrni variabla të shtypura në të vetëm nëse mund të përdorni var
, e cila kufizon kontekstet në të cilat llojet anonime janë të dobishme (për shembull, nuk mund t'i përdorni ato si lloje fushash, lloje kthimi ose lloje parametrash ).
Sigurisht, ju mund të kaloni disa nga kufizimet e llojeve anonime duke përdorur System.Tuple
. I cili është gjithashtu një lloj referimi, dhe ju mund ta përdorni atë në mënyrë eksplicite. E keqja është se i mungojnë emrat e personalizuar për anëtarët.
C# 7 tuples (ValueTuple
) mund të konsiderohet i ngjashëm me llojet anonime. Dallimi i parë është se ato janë lloje vlerash. Kjo do të thotë që këta tuple do të kenë avantazhe të performancës për sa kohë që qëndrojnë në shtrirjen lokale ose janë duke lëvizur nëpër pirg (që është përdorimi i zakonshëm i llojeve anonime, për shkak të kufizimit të tij).
Dallimi i dytë është se sintaksa e re lejon tuples të shfaqen në më shumë vende sesa lloje anonime, siç e dini, ju keni sheqer sintaksor për të përcaktuar llojin e kthimit në ValueTuple
(ndërsa përdorni lloje anonime ju duhej të kthenit object
).
Dallimi i tretë është se ValueTuple
mbështet dekonstruksionin jashtë kutisë. Për të cituar Çfarë ka të re në C# 7.0:
Një mënyrë tjetër për të konsumuar tuple është zbërthimi i tyre. Një deklaratë dekonstruktive është një sintaksë për ndarjen e një tuple (ose vlerë tjetër) në pjesët e saj dhe caktimin e atyre pjesëve individualisht në variabla të freskëta:
(string first, string middle, string last) = LookupName(id1); // deconstructing declaration
WriteLine($"found {first} {last}.");
Gjë që mund ta bëni edhe me llojet e personalizuara duke shtuar një metodë e dekonstruktimit.
Për abstrakt:
ValueTuple
ka sheqer sintaksor në C# 7.0, i cili duhet të merret parasysh për lexueshmëri.
ValueTuple
është një lloj vlere. Zbatohen të gjitha të mirat dhe të këqijat midis përdorimit të një class
dhe një struct
.
ValueTuple
mund të përdoret në mënyrë eksplicite (me ose pa sheqer sintaksor) duke e lejuar atë të ketë shkathtësinë e System.Tuple
duke ruajtur anëtarët e emëruar.
ValueTuple
mbështet dekonstruksionin.
Duke pasur parasysh se duhet të jetë sheqer sintaksor, unë do të thosha se argumenti më i fortë për të zgjedhur ValueTuple
është i njëjti argument për të zgjedhur një struct
. E cila do të ishte ideale për lloje të vogla, të pandryshueshme, që jetojnë kryesisht në pirg (kështu që nuk keni shumë boks dhe çboks).
Duke krahasuar ValueTuple
me një strukturë të plotë, duke marrë parasysh sheqerin sintaksor, unë do të sugjeroja të përdorni ValueTuple
si parazgjedhje, përveç nëse keni nevojë për një paraqitje eksplicite ose duhet të shtoni metoda në të.
Dua të them gjithashtu se sheqeri sintaksor nuk përmirëson domosdoshmërisht lexueshmërinë. Arsyeja kryesore është se ju nuk po e emërtoni llojin dhe emri i llojit i jep kuptim kodit. Përveç kësaj, ju mund të shtoni dokumentacion në një deklaratë struct
ose class
që lehtëson të kuptuarit.
Në përgjithësi, situata ku ValueTuple
shkëlqen vërtet po kthen vlera të shumta nga një metodë. Në këtë rast heqja e nevojës për krijimin e parametrave të rinj out
. Dhe dokumentacioni i ValueTuple
i përdorur mund të jetojë në dokumentacionin e metodës. Nëse gjeni se duhet të bëni diçka tjetër me ValueTuple
(për shembull, duke përcaktuar metodat e zgjerimit), unë do të sugjeroja të konsideroni krijimin e një lloji të emërtuar në vend të kësaj.
20.06.2017
ValueTuple
është lloji i vlerës.Tuple
është lloj referimi. Aq e thjeshtëTuple
nuk do të kopjohet me referencë. Duhet ta përmendni me shkronja të zeza sepse është konfuze tani 20.06.2017