Valu on käsitellä asiaa muuntaa yhden tietotyypin toiseksi, esimerkiksi kokonaisluvutyypistä merkkijonotyypiksi. Jotkut operaatiot VB.NET vaativat tietyt tietotyypit toimimaan. Casting luo tarvitsemasi tyypin. Tämän kaksiosaisen sarjan ensimmäinen artikkeli, valu ja tietotyyppimuunnokset VB.NETissä, esittelee castingin. Tässä artikkelissa kuvataan kolme operaattoria, joiden avulla voit lähettää viestejä VB.NET - DirectCast, CType ja TryCast - ja vertaa niiden suorituskykyä.
Suorituskyky on yksi suurista eroista kolmen valu operaattorin välillä Microsoftin ja muiden artikkeleiden mukaan. Esimerkiksi Microsoft on yleensä varovainen varoittamaan, että "DirectCast... voi tarjota jonkin verran parempaa suorituskykyä kuin CType muunnettaessa datatyyppiin Object ja siitä." (Painotus lisätty.)
Päätin kirjoittaa koodin tarkistaakseen.
Mutta ensin varoituksen sana. Dan Appleman, yksi teknisten kirjojen kustantajan Apress perustajista ja luotettava tekninen tekijä guru, kertoi minulle kerran, että vertailuanalyysien suorittaminen on paljon vaikeampaa tehdä oikein kuin useimmat ihmiset ymmärtää. On olemassa tekijöitä, kuten koneen suorituskyky, muut prosessit, jotka saattavat toimia samanaikaisesti, optimointi kuten muistin välimuisti tai kääntäjän optimointi, ja virheitä oletuksissa siitä, mikä koodi on teet. Näissä vertailuarvoissa olen yrittänyt poistaa "omenoiden ja appelsiinien" vertailuvirheet ja kaikki testit on suoritettu julkaisuversion kanssa. Mutta näissä tuloksissa voi silti olla virheitä. Jos huomaat, ota meihin yhteyttä.
Kolme valuoperaattoria ovat:
- DirectCast
- CTYPE
- TryCast
Käytännössä yleensä huomaat, että sovelluksesi vaatimukset määräävät käyttäjän, jota käytät. DirectCastilla ja TryCastilla on erittäin kapeat vaatimukset. Kun käytät DirectCast-tyyppiä, tyypin on jo tunnettava. Vaikka koodi ...
theString = DirectCast (theobjekti, merkkijono)
... kääntää onnistuneesti, josObject ei ole jo merkkijono, niin koodi heittää ajonaikaista poikkeusta.
TryCast on vielä rajoittavampi, koska se ei toimi lainkaan "arvo" -tyypeillä, kuten kokonaisluku. (Merkkijono on viitetyyppi. Lisätietoja arvo- ja viitetyypeistä on tämän sarjan ensimmäisessä artikkelissa.) Tämä koodi ...
theInteger = TryCast (theobjekti, kokonaisluku)
... ei edes käänny.
TryCast on hyödyllinen, kun et ole varma millaisen objektin kanssa työskentelet. Sen sijaan, että heität virheen, kuten DirectCast, TryCast ei vain palauta mitään. Normaali käytäntö on testata mitään, kun TryCast on suoritettu.
Vain CType (ja muut "Muunna" -operaattorit, kuten CInt ja CBool) muuntaa tyypit, joilla ei ole perintosuhdetta, kuten kokonaisluku, merkkijonoksi:
Himmennä nauha kuin merkkijono = "1" Himmennä intranger kokonaislukuna. theInteger = CType (raita, kokonaisluku)
Tämä toimii, koska CType käyttää "avustajatoimintoja", jotka eivät kuulu .NET CLR: ään (Common Language Runtime) näiden muunnoksien suorittamiseen.
Mutta muista, että CType heittää myös poikkeuksen, jos raita ei sisällä jotain, joka voidaan muuntaa kokonaislukuksi. Jos on mahdollista, että merkkijono ei ole tällainen kokonaisluku ...
Himmennä nauha merkkijonona = "George"
... sitten mikään valuoperaattori ei toimi. Jopa TryCast ei toimi kokonaisluvun kanssa, koska se on arvotyyppi. Tällaisessa tapauksessa joudut käyttämään kelvollisuustarkistusta, kuten TypeOf-operaattoria, tarkistaaksesi tietosi ennen niiden yrittämistä.
Microsoftin DirectCast-dokumentaatiossa mainitaan nimenomaisesti esineiden tyypillä tapahtuva casting, joten juuri sitä käytin ensimmäisessä suoritustestissä. Testaus alkaa seuraavalta sivulta!
DirectCast käyttää yleensä objektityyppiä, joten sitä käytin ensimmäisessä suorituskykytestissäni. Jotta TryCast voidaan sisällyttää testiin, sisällytin myös If-lohkon, koska melkein kaikilla TryCastia käyttävillä ohjelmilla on yksi. Tässä tapauksessa sitä ei kuitenkaan koskaan suoriteta.
Tässä on koodi, joka vertaa kaikkia kolmea heitettäessä objektia merkkijonoon:
Himmennä aika uudena sekuntina () Himmentäkää nauha. Himmentäkää objektiivia objektina = "esine" Himmennä ohjeita kokonaislukuna = CInt (Iteraatiot. Teksti) * 1000000. ' 'DirectCast-testi. aika. Alkaa() Jolle i = 0 Tehtäviin. theString = DirectCast (theobjekti, merkkijono) Seuraava. aika. Lopettaa() DirectCastTime. Teksti = aika. ElapsedMilliseconds. ToString. ' 'CType-testi. aika. Uudelleenkäynnistää() I: lle kokonaislukuna = 0 välityksiin. theString = CType (theobjekti, merkkijono) Seuraava. aika. Lopettaa() CTypeTime. Teksti = aika. ElapsedMilliseconds. ToString. ' 'TryCast-testi. aika. Uudelleenkäynnistää() I: lle kokonaislukuna = 0 välityksiin. theString = TryCast (theobjekti, merkkijono) Jos nauha ei ole mitään, niin. MsgBox ("Tämän ei pitäisi koskaan näyttää") Loppu Jos. Seuraava. aika. Lopettaa() TryCastTime. Teksti = aika. ElapsedMilliseconds. ToString.
Tämä ensimmäinen testi näyttää osoittavan, että Microsoft on oikeassa tavoitteessa. Tässä on tulos. (Kokeet suuremmilla ja pienemmillä iteraatioilla sekä toistuvat testit eri olosuhteissa eivät osoittaneet merkittäviä eroja tästä tuloksesta.)
Napsauta tätä nähdäksesi kuvan
DirectCast ja TryCast olivat samanlaisia 323 ja 356 millisekunnissa, mutta CType otti kolme kertaa enemmän aikaa 1018 millisekunnissa. Kun valuu tällaisia vertailutyyppejä, maksat CType-suorituskyvyn joustavuudesta.
Mutta toimiiko se aina tällä tavalla? Niiden sivulla oleva Microsoft-esimerkki DirectCastista on lähinnä hyödyllinen kertoa sinulle mitä tapa työskentele DirectCastin avulla, ei mitä tulee. Tässä on Microsoft-esimerkki:
Dim q As Object = 2,37. Himmennä kokonaislukuna = CType (q, kokonaisluku) 'Seuraava muuntaminen epäonnistuu ajon aikana. Dim j Kuten kokonaisluku = DirectCast (q, kokonaisluku) Dim f Kuten uusi järjestelmä. Windows. Lomakkeet. Muodostavat. Dim c As System. Windows. Lomakkeet. Ohjaus. Seuraava muuntaminen onnistuu. c = DirectCast (f, järjestelmä. Windows. Lomakkeet. kontrolli)
Toisin sanoen sinä ei voi Käytä DirectCastia (tai TryCastia, vaikka he eivät mainitse sitä täällä) heittääksesi objektityypin kokonaislukuun, mutta sinä voida Käytä DirectCast-ohjelmaa lomaketyypin valintaan ohjaustyyppiin.
Tarkistetaan Microsoftin esimerkin suorituskyky tahtoa työskennellä DirectCastin kanssa. Korvaa... käyttämällä samaa yllä olevaa koodimallia ...
c = DirectCast (f, järjestelmä. Windows. Lomakkeet. kontrolli)
... koodiin yhdessä samanlaisten CType- ja TryCast-korvausten kanssa. Tulokset ovat hiukan yllättäviä.
Napsauta tätä nähdäksesi kuvan
DirectCast oli oikeastaan hitain kolmesta vaihtoehdosta 145 millisekunnissa. CType on vain vähän nopeampi 127 millisekunnissa, mutta TryCast, mukaan lukien If-lohko, on nopein 77 millisekunnissa. Yritin myös kirjoittaa omia esineitäni:
Class ParentClass... Loppu luokka. Luokka ChildClass. Perii ParentClass... Loppu luokka.
Sain samanlaisia tuloksia. Vaikuttaa siltä, että jos olet ei casting Object type, olet parempi ei käyttämällä DirectCastia.