Casting og datatypekonverteringer i VB.NET

Støbning er den behandle at konvertere en datatype til en anden, for eksempel fra en heltalstype til en strengtype. Nogle operationer i VB.NET kræver specifikke datatyper for at arbejde. Casting skaber den type, du har brug for. Den første artikel i denne to-dels-serie, Casting og Datatype-konverteringer i VB.NET, introducerer casting. Denne artikel beskriver de tre operatører, du kan bruge til at caste ind VB.NET - DirectCast, CType og TryCast - og sammenligner deres ydeevne.

Ydeevne er en af ​​de store forskelle mellem de tre casting-operatører ifølge Microsoft og andre artikler. For eksempel er Microsoft normalt omhyggelig med at advare om, at "DirectCast... kan give noget bedre ydelse end CType ved konvertering til og fra datatype Object. "(Fremhævet tilføjet.)

Jeg besluttede at skrive noget kode for at kontrollere.

Men først et ord af forsigtighed. Dan Appleman, en af ​​grundlæggerne af det tekniske bogudgiver Apress og en pålidelig teknisk guru, fortalte mig engang, at benchmarking-ydeevne er meget sværere at gøre korrekt end de fleste mennesker realisere. Der er faktorer som maskinens ydelse, andre processer, der muligvis kører parallelt, optimering som hukommelsescache eller compileroptimering og fejl i dine antagelser om, hvad koden faktisk er gør. I disse benchmarks har jeg forsøgt at fjerne sammenligningsfejl "æbler og appelsiner", og alle test er blevet kørt med frigørelsesopbygningen. Men der kan stadig være fejl i disse resultater. Hvis du bemærker nogen, så fortæl mig det.

instagram viewer

De tre casting-operatører er:

  • DirectCast
  • CIndtast
  • TryCast

Faktisk finder du normalt, at kravene til din applikation vil bestemme, hvilken operatør du bruger. DirectCast og TryCast har meget snævre krav. Når du bruger DirectCast, skal typen allerede være kendt. Selvom koden ...

theString = DirectCast (theObject, String)

... kompileres med succes, hvis Objektet ikke allerede er en streng, så kaster koden en runtime-undtagelse.

TryCast er endnu mere restriktiv, fordi det overhovedet ikke fungerer på "værdi" -typer som heltal. (Streng er en referencetype. Se den første artikel i denne serie for mere om værdityper og referencetyper.) Denne kode ...

theInteger = TryCast (theobjektet, heltal)

... vil ikke engang kompilere.

TryCast er nyttigt, når du ikke er sikker på, hvilken type objekt du arbejder med. I stedet for at kaste en fejl som DirectCast, returnerer TryCast bare intet. Den normale praksis er at teste for ingenting efter at have udført TryCast.

Kun CType (og de andre "Konverter" -operatører som CInt og CBool) konverterer typer, der ikke har et arveforhold, såsom et heltal til en streng:

Dim theString som streng = "1" Dæmm heltalet som heltal. theInteger = CType (theString, Integer)

Dette fungerer, fordi CType bruger "hjælperfunktioner", der ikke er en del af .NET CLR (Common Language Runtime) til at udføre disse konverteringer.

Men husk, at CType også vil kaste en undtagelse, hvis strengen ikke indeholder noget, der kan konverteres til et heltal. Hvis der er en mulighed for, at strengen ikke er et heltal som dette ...


Dim theString As String = "George"

... så fungerer ingen casting-operatør. Selv TryCast fungerer ikke med heltal, fordi det er en værditype. I et tilfælde som dette skal du bruge gyldighedskontrol, f.eks. Operatøren TypeOf, til at kontrollere dine data, før du prøver at caste dem.

Microsofts dokumentation for DirectCast nævner specifikt casting med en objekttype, så det var det, jeg brugte i min første ydelsestest. Testning begynder på næste side!

DirectCast bruger normalt en Objekttype, så det var det, jeg brugte i min første ydelsestest. For at inkludere TryCast i testen inkluderede jeg også en If-blok, da næsten alle programmer, der bruger TryCast, vil have en. I dette tilfælde vil det dog aldrig blive udført.

Her er koden, der sammenligner alle tre, når du støber et objekt til en streng:

Dim theTime som nyt stopur () Dim theString som streng. Dæmm theObject As Object = "Et objekt" Dim theIterations som heltal = CInt (Iterationer. Tekst) * 1000000. ' 'DirectCast-test. tiden. Start() For i = 0 Til oplysningerne. theString = DirectCast (theObject, String) Næste. tiden. Hold op() DirectCastTime. Tekst = tiden. ElapsedMilliseconds. ToString. ' 'CType-test. tiden. Genstart() For i som heltal = 0 til indstillingerne. theString = CType (theObject, String) Næste. tiden. Hold op() CTypeTime. Tekst = tiden. ElapsedMilliseconds. ToString. ' 'TryCast Test. tiden. Genstart() For i som heltal = 0 til indstillingerne. theString = TryCast (theObject, String) Hvis strengen ikke er noget derefter. MsgBox ("Dette skal aldrig vises") Afslut Hvis. Næste. tiden. Hold op() TryCastTime. Tekst = tiden. ElapsedMilliseconds. ToString.

Denne første test ser ud til at vise, at Microsoft har ret i mål. Her er resultatet. (Eksperimenter med større og mindre antal iterationer såvel som gentagne tests under forskellige betingelser viste ikke nogen signifikante forskelle fra dette resultat.)


Klik her for at få vist illustrationen

DirectCast og TryCast var ens ved 323 og 356 millisekunder, men CType tog over tre gange så meget tid på 1018 millisekunder. Når du støber henvisningstyper som denne, betaler du for fleksibiliteten i CType i ydelsen.

Men fungerer det altid på denne måde? Microsoft-eksemplet på deres side til DirectCast er hovedsageligt nyttigt til at fortælle dig hvad vil ikke arbejde med DirectCast, ikke hvad der vil. Her er Microsoft-eksemplet:

Dim q som objekt = 2,37. Dim i som heltal = CType (q, heltal) 'Følgende konvertering mislykkes ved kørsel. Dim j som heltal = DirectCast (q, heltal) Dim f som nyt system. Windows. Formularer. Form. Dim c Som system. Windows. Formularer. Styring. 'Følgende konvertering lykkes. c = DirectCast (f, System. Windows. Formularer. Styring)

Med andre ord dig kan ikke Brug DirectCast (eller TryCast, selvom de ikke nævner det her) til at kaste en objekttype til en heltalstype, men du kan Brug DirectCast til at caste en formtype til en kontroltype.

Lad os kontrollere ydelsen af ​​Microsofts eksempel på hvad vilje arbejde med DirectCast. Ved hjælp af den samme kodeskabelon, der er vist ovenfor, skal du erstatte ...


c = DirectCast (f, System. Windows. Formularer. Styring)

... ind i koden sammen med lignende substitutioner for CType og TryCast. Resultaterne er lidt overraskende.


Klik her for at få vist illustrationen

DirectCast var faktisk den langsomste af de tre valg på 145 millisekunder. CType er bare lidt hurtigere ved 127 millisekunder, men TryCast, inklusive en If-blok, er den hurtigste ved 77 millisekunder. Jeg prøvede også at skrive mine egne objekter:


Class ParentClass... Slutteklasse. Klasse ChildClass. Arv ParentClass... Slutteklasse. 

Jeg fik lignende resultater. Det ser ud til, at hvis du er ikke Når du støber en objekttype, er du bedre stillet ikke ved hjælp af DirectCast.

instagram story viewer