Casting og datatypekonverteringer i VB.NET

click fraud protection

Støping er den prosess å konvertere en datatype til en annen, for eksempel fra en heltallstype til en strengtype. Noen operasjoner i VB.NET krever spesifikke datatyper for å fungere. Casting skaper typen du trenger. Den første artikkelen i denne todelte serien, Casting and Data Type Conversions in VB.NET, introduserer casting. Denne artikkelen beskriver de tre operatørene du kan bruke til å kaste inn VB.NET - DirectCast, CType og TryCast - og sammenligner ytelsen deres.

Ytelse er en av de store forskjellene mellom de tre casting-operatørene i følge Microsoft og andre artikler. For eksempel er Microsoft vanligvis nøye med å advare om at "DirectCast... kan gi noe bedre ytelse enn CType ved konvertering til og fra datatype Object. "(Vekt lagt til.)

Jeg bestemte meg for å skrive litt kode for å sjekke.

Men først et ord av forsiktighet. Dan Appleman, en av grunnleggerne av det tekniske bokforlaget Apress og en pålitelig teknisk guru, fortalte meg en gang at benchmarking-ytelse er mye vanskeligere å gjøre riktig enn folk flest innse. Det er faktorer som maskinytelse, andre prosesser som kan kjøres parallelt, optimalisering som minnehurtigbuffer eller kompilatoroptimalisering, og feil i forutsetningene dine om hva koden faktisk er gjør. I disse referansepunktene har jeg prøvd å eliminere "epler og appelsiner" sammenligningsfeil, og alle testene har blitt kjørt med utgivelsesbyggingen. Men det kan fortsatt være feil i disse resultatene. Hvis du legger merke til noen, gi meg beskjed.

instagram viewer

De tre casting-operatørene er:

  • DirectCast
  • CTYPE
  • TryCast

Rent praktisk vil du vanligvis oppdage at kravene til søknaden din vil avgjøre hvilken operatør du bruker. DirectCast og TryCast har veldig smale krav. Når du bruker DirectCast, må typen allerede være kjent. Selv om koden ...

theString = DirectCast (theObject, String)

... vil kompilere vellykket hvis Objektet ikke allerede er en streng, vil koden kaste et runtime-unntak.

TryCast er enda mer restriktiv fordi det ikke i det hele tatt vil fungere på "verdi" -typer som heltal. (Streng er en referansetype. Hvis du vil ha mer informasjon om verdityper og referansetyper, kan du se den første artikkelen i denne serien.) Denne koden ...

theInteger = TryCast (theObject, Integer)

... vil ikke engang sammenstille.

TryCast er nyttig når du ikke er sikker på hvilken type objekt du jobber med. I stedet for å kaste en feil som DirectCast, returnerer TryCast bare ingenting. Den vanlige praksisen er å teste for ingenting etter å ha utført TryCast.

Bare CType (og de andre "Konverter" -operatørene som CInt og CBool) vil konvertere typer som ikke har et arveforhold, for eksempel et heltall til en streng:

Demp theString As String = "1" Dimm thentallet som heltall. theInteger = CType (theString, Integer)

Dette fungerer fordi CType bruker "hjelperfunksjoner" som ikke er en del av .NET CLR (Common Language Runtime) for å utføre disse konverteringene.

Men husk at CType også vil kaste et unntak hvis strengen ikke inneholder noe som kan konverteres til et heltall. Hvis det er en mulighet for at strengen ikke er et helt tall som dette ...


Dim theString As String = "George"

... da vil ingen casting-operatør fungere. Selv TryCast vil ikke fungere med heltall fordi det er en verditype. I et tilfelle som dette, må du bruke gyldighetskontroll, for eksempel TypeOf-operatøren, for å sjekke dataene dine før du prøver å caste dem.

Microsofts dokumentasjon for DirectCast nevner spesifikt casting med en objekttype, så det var det jeg brukte i min første ytelsestest. Testingen begynner på neste side!

DirectCast vil vanligvis bruke en objekttype, så det er det jeg brukte i min første ytelsestest. For å inkludere TryCast i testen, inkluderte jeg også en If-blokk fordi nesten alle programmer som bruker TryCast vil ha en. I dette tilfellet vil den imidlertid aldri bli henrettet.

Her er koden som sammenligner alle tre når du støper et objekt til en streng:

Dim theTime som ny stoppeklokke () Dim theString som streng. Dimm theObject As Object = "Et objekt" Dimm teoriene som heltall = CInt (Iterasjoner. Tekst) * 1000000. ' 'DirectCast Test. tiden. Start() For i = 0 Til informasjonen. theString = DirectCast (theObject, String) Neste. tiden. Stoppe() DirectCastTime. Tekst = tiden. ElapsedMilliseconds. ToString. ' CType-test. tiden. Omstart() For i Som heltall = 0 Til teikningene. theString = CType (theObject, String) Neste. tiden. Stoppe() CTypeTime. Tekst = tiden. ElapsedMilliseconds. ToString. ' 'TryCast Test. tiden. Omstart() For i Som heltall = 0 Til teikningene. theString = TryCast (theObject, String) Hvis strengen er ingenting da. MsgBox ("Dette skal aldri vises") Slutt om. Neste. tiden. Stoppe() TryCastTime. Tekst = tiden. ElapsedMilliseconds. ToString.

Denne første testen ser ut til å vise at Microsoft er rett i mål. Her er resultatet. (Eksperimenter med større og mindre antall iterasjoner så vel som gjentatte tester under forskjellige forhold viste ikke noen signifikante forskjeller fra dette resultatet.)


Klikk her for å vise illustrasjonen

DirectCast og TryCast var like ved 323 og 356 millisekunder, men CType tok over tre ganger så mye tid på 1018 millisekunder. Når du støper referansetyper som denne, betaler du for fleksibiliteten til CType i ytelse.

Men fungerer det alltid på denne måten? Microsoft-eksemplet på siden deres for DirectCast er hovedsakelig nyttig for å fortelle deg hva vil ikke arbeid med DirectCast, ikke hva som vil. Her er Microsoft-eksempelet:

Dim q som objekt = 2,37. Dim i som heltall = CType (q, heltall) 'Følgende konvertering mislykkes ved kjøretid. Dim j som heltall = DirectCast (q, heltall) Dim f Som nytt system. Windows. Former. Form. Dim c As System. Windows. Former. Styre. 'Følgende konvertering lykkes. c = DirectCast (f, System. Windows. Former. Styre)

Med andre ord, du kan ikke bruk DirectCast (eller TryCast, selv om de ikke nevner det her) for å kaste en objekttype til en heltallstype, men du kan bruk DirectCast til å caste en formtype til en kontrolltype.

La oss sjekke ytelsen til Microsofts eksempel på hva vil jobbe med DirectCast. Bruk den samme kodemalen som vist ovenfor, erstatt ...


c = DirectCast (f, System. Windows. Former. Styre)

... inn i koden sammen med lignende erstatninger for CType og TryCast. Resultatene er litt overraskende.


Klikk her for å vise illustrasjonen

DirectCast var faktisk den tregeste av de tre valgene på 145 millisekunder. CType er bare litt raskere på 127 millisekunder, men TryCast, inkludert en If-blokk, er den raskeste på 77 millisekunder. Jeg prøvde også å skrive mine egne objekter:


Class ParentClass... Sluttklasse. Class ChildClass. Arv ParentClass... Sluttklasse. 

Jeg fikk lignende resultater. Det ser ut til at hvis du er det ikke casting av en objekttype, er du bedre ikke bruker DirectCast.

instagram story viewer