Konverze obsazení a datového typu ve VB.NET

click fraud protection

Casting je proces převodu jednoho typu dat na jiný, například z typu Integer na typ String. Některé operace v VB.NET vyžadují určité typy dat, aby fungovaly. Odlévání vytvoří požadovaný typ. První článek v této dvoudílné řadě Casting a Konverze datových typů ve VB.NET zavádí casting. Tento článek popisuje tři operátory, které můžete použít VB.NET - DirectCast, CType a TryCast - a porovnává jejich výkon.

Výkon je jedním z velkých rozdílů mezi třemi operátory castingů podle společnosti Microsoft a dalších článků. Například Microsoft obvykle upozorňuje, že „DirectCast... může poskytovat o něco lepší výkon než CType při převodu do az datového typu Object. “(Důraz byl přidán.)

Rozhodl jsem se napsat nějaký kód ke kontrole.

Nejdříve ale opatrně. Dan Appleman, jeden ze zakladatelů vydavatele technické knihy Apress a spolehlivého technického pracovníka guru, jednou mi řekl, že srovnávací výkon je mnohem těžší dělat správně než většina lidí realizovat. Existují faktory, jako je výkon stroje, další procesy, které mohou běžet paralelně, optimalizace jako je ukládání do paměti cache nebo optimalizace kompilátoru a chyby ve vašich předpokladech o tom, co je kód ve skutečnosti dělá. V těchto benchmarcích jsem se pokusil eliminovat chyby porovnávání „jablek a pomerančů“ a všechny testy byly spuštěny s verzí vydání. V těchto výsledcích však stále mohou být chyby. Pokud si toho všimnete, dejte mi prosím vědět.

instagram viewer

Tři operátoři lití jsou:

  • DirectCast
  • CType
  • TryCast

V praxi obvykle zjistíte, že požadavky vaší aplikace určí, který operátor používáte. DirectCast a TryCast mají velmi úzké požadavky. Při použití DirectCast musí být typ již znám. Přestože kód ...

theString = DirectCast (theObject, String)

... bude úspěšně zkompilován, pokud theObject již není řetězec, pak kód vyvolá runtime výjimku.

TryCast je ještě restriktivnější, protože nebude fungovat vůbec u „hodnotových“ typů, jako je Integer. (Řetězec je typ odkazu. Další informace o typech hodnot a referenčních typech naleznete v prvním článku této řady.) Tento kód ...

theInteger = TryCast (theObject, Integer)

... nebude se kompilovat.

TryCast je užitečný, když si nejste jisti, s jakým typem objektu pracujete. Spíše než házení chyby jako DirectCast, TryCast prostě nevrací nic. Běžnou praxí je po provedení programu TryCast otestovat nic.

Pouze CType (a další operátoři „Převést“ jako CInt a CBool) převedou typy, které nemají dědičný vztah, jako je Integer, na String:

Dim theString As String = "1" Dim theInteger As Integer. theInteger = CType (theString, Integer)

Funguje to proto, že CType používá „pomocné funkce“, které nejsou součástí .NET CLR (Common Language Runtime), k provedení těchto konverzí.

Nezapomeňte však, že CType také vyvolá výjimku, pokud TheString neobsahuje něco, co lze převést na celé číslo. Pokud existuje možnost, že řetězec není celé toto číslo ...


Dim theString As String = "George"

... pak žádný operátor odlévání nebude fungovat. Ani TryCast nebude pracovat s Integerem, protože je to typ hodnoty. V takovém případě byste museli před pokusem o odevzdání dat zkontrolovat data, například operátor TypeOf.

Dokumentace společnosti Microsoft pro DirectCast konkrétně zmiňuje casting s typem objektu, takže jsem použil svůj první test výkonu. Testování začíná na další stránce!

DirectCast obvykle používá typ objektu, takže jsem použil svůj první test výkonu. Pro zahrnutí TryCastu do testu jsem také zahrnul blok If, protože téměř všechny programy, které používají TryCast, budou mít jeden. V tomto případě však nikdy nebude proveden.

Zde je kód, který porovnává všechny tři při přetypování objektu na řetězec:

Dim theTime as New Stopwatch () Dim theString jako String. Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (Iterace. Text) * 1000000. ' „Test DirectCast. čas. Start() Pro i = 0 k iteracím. theString = DirectCast (theObject, String) Další. čas. Stop() DirectCastTime. Text = čas. Uplynuly milisekundy. ToString. ' „Test CType. čas. Restartovat () Pro i As Integer = 0 TheIterations. theString = CType (theObject, String) Další. čas. Stop() CTypeTime. Text = čas. Uplynuly milisekundy. ToString. ' "TryCast Test." čas. Restartovat () Pro i As Integer = 0 TheIterations. theString = TryCast (theObject, String) Pokud tedy TheString nic není. MsgBox („Toto by se nikdy nemělo zobrazovat“) Konec If. Další. čas. Stop() TryCastTime. Text = čas. Uplynuly milisekundy. ToString.

Zdá se, že tento počáteční test ukazuje, že Microsoft má pravdu. Zde je výsledek. (Pokusy s větším a menším počtem iterací a opakované testy za různých podmínek neprokázaly žádné významné rozdíly od tohoto výsledku.)


Klepnutím sem zobrazíte obrázek

DirectCast a TryCast byly podobné ve 323 a 356 milisekundách, ale CType převzal třikrát tolik času v 1018 milisekundách. Při obsazení referenčních typů, jako je tento, platíte za flexibilitu výkonu CType.

Ale funguje to vždy takto? Příklad Microsoftu na jejich stránce pro DirectCast je užitečný zejména při sdělování informací zvyklý pracovat pomocí DirectCast, ne co bude. Zde je příklad společnosti Microsoft:

Dim q As Object = 2.37. Dim i As Integer = CType (q, Integer) 'Následující konverze selhala za běhu. Dim j As Integer = DirectCast (q, Integer) Dim f jako nový systém. Okna. Formuláře. Formulář. Dim c As System. Okna. Formuláře. Řízení. „Následující konverze proběhla úspěšně. c = DirectCast (f, systém. Okna. Formuláře. Řízení)

Jinými slovy, vy nemůže použijte DirectCast (nebo TryCast, i když to zde nezmiňují) k přetypování typu objektu na celé číslo, ale vy umět použijte DirectCast k přetypování typu formuláře na typ kontroly.

Podívejme se na to, jak vypadá příklad Microsoft vůle pracovat s DirectCast. Použijte stejnou šablonu kódu uvedenou výše, ...


c = DirectCast (f, systém. Okna. Formuláře. Řízení)

... do kódu spolu s podobnými substitucemi pro CType a TryCast. Výsledky jsou trochu překvapivé.


Klepnutím sem zobrazíte obrázek

DirectCast byl ve skutečnosti nejpomalejší ze tří voleb za 145 milisekund. CType je o něco rychlejší za 127 milisekund, ale TryCast, včetně bloku If, je nejrychlejší za 77 milisekund. Také jsem se pokusil napsat vlastní objekty:


Třída ParentClass... Koncová třída. Třída ChildClass. Zdědí ParentClass... Koncová třída. 

Mám podobné výsledky. Zdá se, že pokud jste ne casting objektu typu, jste lepší ne pomocí DirectCast.

instagram story viewer