Casting je proces konverzie jedného typu údajov na iný, napríklad z typu Integer na typ String. Niektoré operácie v roku 2006 VB.NET vyžadovať fungovanie konkrétnych typov údajov. Odlievanie vytvára požadovaný typ. Prvý článok v tejto dvojdielnej sérii Casting a Konverzia typov údajov vo VB.NET predstavuje casting. Tento článok popisuje troch operátorov, pomocou ktorých môžete vykonať zadávanie VB.NET - DirectCast, CType a TryCast - a porovnáva ich výkonnosť.
Výkon je jedným z veľkých rozdielov medzi tromi operátormi castingu podľa spoločnosti Microsoft a ďalších článkov. Napríklad spoločnosť Microsoft zvyčajne upozorňuje, že „DirectCast... môžu poskytovať o niečo lepší výkon ako CType pri prevode na a z dátového typu Object. “(Zdôraznenie pridané.)
Rozhodol som sa napísať nejaký kód na kontrolu.
Najskôr však opatrne. Dan Appleman, jeden zo zakladateľov vydavateľa technickej knihy Apress a spoľahlivého technického pracovníka guru, raz mi povedal, že porovnávanie výkonnosti je oveľa ťažšie robiť správne ako väčšina ľudí realizovať. Existujú faktory ako výkon stroja, ďalšie procesy, ktoré môžu bežať súbežne, optimalizácia napríklad ukladanie do pamäte cache alebo optimalizácia kompilátora a chyby vo vašich predpokladoch o tom, čo je kód v skutočnosti robí. V týchto referenčných hodnotách som sa pokúsil eliminovať chyby porovnávania „jabĺk a pomarančov“ a všetky testy boli vykonané so zostavením verzie. V týchto výsledkoch však stále môžu byť chyby. Ak si to všimnete, dajte mi vedieť.
Traja operátori castingu sú:
- DirectCast
- Cdruh
- TryCast
V praxi zvyčajne zistíte, že požiadavky vašej aplikácie určia, ktorý operátor používate. DirectCast a TryCast majú veľmi úzke požiadavky. Ak používate DirectCast, typ musí byť už známy. Aj keď kód ...
theString = DirectCast (theObject, String)
... sa úspešne skompiluje, ak objektObjekt už nie je reťazcom, potom kód vyhodí runtime výnimku.
TryCast je ešte reštriktívnejší, pretože nebude fungovať vôbec pri „hodnotových“ typoch, ako je Integer. (Reťazec je referenčný typ. Viac informácií o typoch hodnôt a referenčných typoch nájdete v prvom článku tejto série.) Tento kód ...
theInteger = TryCast (theObject, Integer)
... nebude sa kompilovať.
TryCast je užitočný, keď si nie ste istí, s akým typom objektu pracujete. Skôr než hádzať chybu, ako je DirectCast, TryCast jednoducho nevráti nič. Bežnou praxou je testovať nič po vykonaní programu TryCast.
Iba CType (a ostatní operátori „Konvertovať“ ako CInt a CBool) prevedú typy, ktoré nemajú dedičský vzťah, ako napríklad Integer, na String:
Dim theString As String = "1" Dim theInteger As Integer. theInteger = CType (TheString, Integer)
Funguje to preto, že CType používa na vykonanie týchto konverzií „pomocné funkcie“, ktoré nie sú súčasťou .NET CLR (Common Language Runtime).
Pamätajte však, že CType vyvolá výnimku aj v prípade, že TheString neobsahuje niečo, čo by bolo možné previesť na celé číslo. Ak existuje možnosť, že reťazec nie je celé toto číslo ...
Dim theString As String = "George"
... potom nebude fungovať žiadny operátor casting. Ani program TryCast nebude pracovať s Integerom, pretože ide o typ hodnoty. V takomto prípade by ste pred pokusom o odovzdanie údajov museli skontrolovať svoje údaje, napríklad operátor TypeOf, na kontrolu údajov.
Dokumentácia spoločnosti Microsoft pre DirectCast sa konkrétne odvoláva na casting s typom objektu, takže som použil pri svojom prvom teste výkonnosti. Testovanie sa začína na ďalšej strane!
DirectCast zvyčajne používa typ objektu, takže som použil tento prvý test výkonnosti. Ak chcete do testu zahrnúť TryCast, zahrnul som aj blok If, pretože takmer všetky programy, ktoré používajú TryCast, budú mať jeden. V takom prípade sa však nikdy nevykoná.
Tu je kód, ktorý pri prenášaní objektu na reťazec porovnáva všetky tri:
Stlmiť čas ako nové stopky () Dim theString as String. Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (Iterácie. Text) * 1000000. ' „Test DirectCast. čas. Štart () Pre i = 0 k iteráciám. theString = DirectCast (theObject, String) Ďalšie. čas. Stop () DirectCastTime. Text = čas. ElapsedMilliseconds. Natiahnuť. ' 'Test CType. čas. Reštart() Pre i As Integer = 0 TheIterations. theString = CType (theObject, String) Ďalšie. čas. Stop () CTypeTime. Text = čas. ElapsedMilliseconds. Natiahnuť. ' 'TryCast Test. čas. Reštart() Pre i As Integer = 0 TheIterations. theString = TryCast (theObject, String) Ak potom nie je nič. MsgBox („Toto by sa nikdy nemalo zobraziť“) Koniec Ak. Ďalšie. čas. Stop () TryCastTime. Text = čas. ElapsedMilliseconds. Natiahnuť.
Zdá sa, že tento počiatočný test ukazuje, že Microsoft je na správnom mieste. Tu je výsledok. (Pokusy s väčším a menším počtom iterácií, ako aj opakované testy za rôznych podmienok nepreukázali žiadne významné rozdiely od tohto výsledku.)
Kliknutím sem zobrazíte ilustráciu
DirectCast a TryCast boli podobné v 323 a 356 milisekundách, ale CType prevzal trikrát toľko času v 1018 milisekundách. Pri prenášaní referenčných typov, ako je tento, platíte za flexibilitu výkonu CType.
Ale vždy to funguje takto? Príklad Microsoftu na ich stránke pre DirectCast je užitočný najmä na to, aby ste vedeli čo nebude prácu pomocou DirectCastu, nie čo. Tu je príklad spoločnosti Microsoft:
Dim q As Object = 2.37. Dim i As Integer = CType (q, Integer) „Nasledujúca konverzia zlyhá v čase spustenia. Dim j As Integer = DirectCast (q, Integer) Dim f ako nový systém. Windows. Formy. Formulár. Dim c As System. Windows. Formy. Ovládanie. „Nasledujúca konverzia je úspešná. c = DirectCast (f, systém. Windows. Formy. control)
Inými slovami, vy nemôžu použiť DirectCast (alebo TryCast, aj keď to tu nespomínajú) na obsadenie typu objektu na celé číslo, ale vy môcť použiť DirectCast na prenášanie typu formulára na typ kontroly.
Pozrime sa na to, aký je príklad Microsoftu vôľa pracovať s DirectCast. Použitím rovnakej šablóny kódu ako je uvedené vyššie, ...
c = DirectCast (f, systém. Windows. Formy. control)
... do kódu spolu s podobnými substitúciami pre CType a TryCast. Výsledky sú trochu prekvapujúce.
Kliknutím sem zobrazíte ilustráciu
DirectCast bol vlastne najpomalší z troch možností za 145 milisekúnd. CType je o niečo rýchlejší za 127 milisekúnd, ale funkcia TryCast vrátane bloku If je najrýchlejšia za 77 milisekúnd. Tiež som sa pokúsil napísať vlastné objekty:
Trieda Rodičovská trieda... Koncová trieda. Trieda ChildClass. Dedí ParentClass... Koncová trieda.
Mám podobné výsledky. Zdá sa, že ak ste nie obsadenie typu objektu je lepšie nie pomocou DirectCast.