Casting je onaj postupak pretvaranja jedne vrste podataka u drugu, na primjer, iz vrste Integer u String tip. Neke su operacije u VB.NET zahtijevaju posebne vrste podataka za rad. Casting stvara vrstu koja vam je potrebna. Prvi članak u ovom dvodijelnom nizu, Casting i pretvorba podataka u VB.NET-u, uvodi lijevanje. U ovom su članku opisana tri operatora na koja možete igrati VB.NET - DirectCast, CType i TryCast - i uspoređuje njihovu izvedbu.
Učinak je jedna od velikih razlika između tri operatora lijevanja prema Microsoftu i drugim člancima. Na primjer, Microsoft obično oprezno upozori to, "DirectCast... mogu pružiti nešto bolje performanse od CType-a pri pretvaranju u i iz vrste podataka Objekt. "(Naglasak dodan.)
Odlučio sam napisati neki kod da provjerim.
Ali najprije riječ opreza. Dan Appleman, jedan od osnivača izdavača tehničke knjige Apress i pouzdan tehničar guru, jednom mi je rekao da je uspješnost usporednog vrednovanja mnogo teže ispravno napraviti od većine ljudi ostvariti. Postoje čimbenici poput performansi stroja, drugih procesa koji se mogu paralelno odvijati, optimizacija poput predmemoriranja memorije ili optimizacije prevoditelja i pogreške u vašim pretpostavkama o tome što je zapravo kôd radi. Na ovim smo referentnim vrijednostima pokušali ukloniti pogreške usporedbe "jabuke i naranče" i svi su testovi pokrenuti s izgradnjom izdanja. Ali još uvijek može biti pogrešaka u tim rezultatima. Ako primijetite bilo koje, molim vas da me obavijestite.
Tri operatora lijevanja su:
- DirectCast
- CTYPE
- TryCast
U praksi ćete obično ustanoviti da će zahtjevi vaše aplikacije određivati kojeg operatora koristite. DirectCast i TryCast imaju vrlo uske zahtjeve. Kad koristite DirectCast, tip se mora već znati. Iako je kôd ...
theString = DirectCast (theObject, string)
... uspješno će se sastaviti ako theObject već nije niz, tada će kôd izuzeti vrijeme izuzeća.
TryCast je još restriktivniji jer neće uopće raditi na "vrijednost" vrsta kao što je Integer. (Niz je referentna vrsta. Više o vrstama vrijednosti i referentnim vrstama potražite u prvom članku u ovoj seriji.) Ovaj kôd ...
theInteger = TryCast (theObject, Integer)
... neće se sastaviti.
TryCast je koristan kada niste sigurni s kojom vrstom objekta radite. Umjesto da baci pogrešku kao što je DirectCast, TryCast samo vraća Ništa. Uobičajena praksa je testirati ništa nakon izvršenja TryCast-a.
Samo CType (i ostali operateri "Pretvori" poput CInt i CBool) pretvorit će vrste koje nemaju odnos nasljeđivanja, poput Integer-a, u niz:
ZatamniString kao niz = "1" Označite Integer kao Cijeli broj. theInteger = CType (theString, Integer)
Ovo funkcionira zato što CType koristi "pomoćne funkcije" koje nisu dio .NET CLR (uobičajenog jezika rada) za izvođenje tih pretvorbi.
Ali zapamtite da će CType izbaciti i iznimku ako theString ne sadrži nešto što se može pretvoriti u Integer. Ako postoji mogućnost da niz nije cijeli broj poput ovog ...
Zatamnite theString kao string = "George"
... tada nijedan operater lijevanja neće raditi. Čak TryCast neće raditi s Integerom jer je tip vrijednosti. U slučaju poput ovog, morat ćete upotrijebiti provjeru valjanosti, kao što je operator TypeOf, kako biste provjerili svoje podatke prije nego što ih pokušate emitirati.
Microsoftova dokumentacija za DirectCast posebno spominje kasting s tipom Object, tako da sam to upotrijebio u svom prvom testu performansi. Testiranje započinje na sljedećoj stranici!
DirectCast će obično koristiti tip Objekta, tako da sam to upotrijebio u svom prvom testu performansi. Kako bih u test uključio TryCast, uključio sam i blok If jer će ga imati gotovo svi programi koji koriste TryCast. U ovom slučaju, međutim, nikada neće biti izvršen.
Evo koda koji uspoređuje sve tri prilikom lijevanja objekta u niz:
Zatamnite vrijeme kao novi štoperica () Prigušite string kao niz. Zatamni objekt kao objekt = "Objekt" Prigušite slike kao cijeli broj = CInt (Iteracije. Tekst) * 1000000. ' 'DirectCast test. vrijeme. Početak() Za i = 0 Na Iteracije. theString = DirectCast (theObject, string) Sljedeći. vrijeme. Stop() DirectCastTime. Tekst = vrijeme. ElapsedMilliseconds. ToString. ' 'CType test. vrijeme. Ponovno () Za i kao cjelobrojni podatak = 0 na stranice. theString = CType (theObject, string) Sljedeći. vrijeme. Stop() CTypeTime. Tekst = vrijeme. ElapsedMilliseconds. ToString. ' 'TryCast test. vrijeme. Ponovno () Za i kao cjelobrojni podatak = 0 na stranice. theString = TryCast (theObject, string) Ako strina nije ništa onda. MsgBox ("Ovo se nikada ne smije prikazati") Završi ako. Sljedeći. vrijeme. Stop() TryCastTime. Tekst = vrijeme. ElapsedMilliseconds. ToString.
Čini se da ovaj početni test pokazuje da je Microsoft točno na meti. Evo rezultata. (Eksperimenti s većim i manjim brojem ponavljanja, kao i ponovljeni testovi pod različitim uvjetima nisu pokazali značajne razlike od ovog rezultata.)
Kliknite ovdje za prikaz ilustracije
DirectCast i TryCast bili su slični u 323 i 356 milisekundi, ali CType je preuzeo tri puta više vremena u 1018 milisekundi. Prilikom lijevanja ovakvih referentnih vrsta plaćate fleksibilnost CType-a u izvedbi.
Ali, djeluje li uvijek na ovaj način? Microsoftov primjer na njihovoj stranici za DirectCast uglavnom je koristan kako bi vam rekao što navika raditi koristeći DirectCast, a ne što će. Evo Microsoftovog primjera:
Dim q kao objekt = 2,37. Dim i As Integer = CType (q, Integer) 'Sljedeća konverzija ne uspijeva u vrijeme izvođenja. Dim j kao Integer = DirectCast (q, cijeli broj) Dim f kao novi sustav. Windows. Obrasci. Oblik. Dim c kao sustav. Windows. Obrasci. Kontrolirati. 'Sljedeća konverzija uspijeva. c = DirectCast (f, Sustav. Windows. Obrasci. Kontrolirati)
Drugim riječima, vi ne mogu upotrijebite DirectCast (ili TryCast, iako ga ovdje ne spominju) da biste tip predmeta predali vrsti Integer, ali vi limenka koristite DirectCast za dodjelu vrste obrasca kontrolnom tipu.
Provjerimo izvedbu Microsoftovog primjera onoga htjeti surađujte s DirectCastom. Koristeći isti predložak koda prikazan gore, zamijenite ...
c = DirectCast (f, Sustav. Windows. Obrasci. Kontrolirati)
... u kod zajedno sa sličnim zamjenama za CType i TryCast. Rezultati su pomalo iznenađujući.
Kliknite ovdje za prikaz ilustracije
DirectCast je zapravo bio najsporiji od tri izbora u 145 milisekundi. CType je samo malo brži u 127 milisekundi, ali TryCast, uključujući blok If, najbrži je za 77 milisekundi. Pokušao sam i s pisanjem vlastitih predmeta:
Razred ParentClass... Krajnja klasa. Razred ChildClass. Nasljeđuje ParentClass... Krajnja klasa.
Dobio sam slične rezultate. Izgleda da ako jesi ne lijevanje vrste objekta, bolje vam je ne koristeći DirectCast.