Casting ja andmetüübi teisendused VB.NET-is

Casting on protsess ühe andmetüübi teisendamiseks teiseks, näiteks täisarvutüübilt stringi tüüpi. Mõned operatsioonid VB.NET töötamiseks on vaja konkreetseid andmetüüpe. Casting loob vajaliku tüübi. Selle kaheosalise seeria esimene artikkel, VB.NET-i casting ja andmetüübi teisendused tutvustab castingut. See artikkel kirjeldab kolme operaatorit, kelle abil saate sisse logida VB.NET - DirectCast, CType ja TryCast - ja võrreldakse nende jõudlust.

Toimivus on Microsofti ja teiste artiklite kohaselt üks suurtest erinevustest kolme casting operaatori vahel. Näiteks hoiatab Microsoft tavaliselt ettevaatlikult, et "DirectCast... võib pakkuda mõnevõrra paremat jõudlust kui CType kui konverteeritakse andmetüüpi Object ja sellelt. "(Rõhuasetus lisatud.)

Otsustasin kontrollimiseks kirjutada mõne koodi.

Kuid kõigepealt ettevaatusega. Dan Appleman, üks tehniliste raamatute kirjastaja Apress asutajaid ja usaldusväärne tehnik guru, ütles mulle kunagi, et võrdlusuuringute tulemusi on palju raskem õigesti teha kui enamikul inimestel aru saama. On selliseid tegureid nagu masina jõudlus, muud protsessid, mis võivad paralleelselt töötada, optimeerimine nagu mälu vahemällu salvestamine või kompilaatori optimeerimine ja vead eeldustes selle kohta, mis kood tegelikult on teed. Nendes võrdlusalustes olen püüdnud kõrvaldada "õunte ja apelsinide" võrdlusvead ja kõik testid on tehtud väljalaskepõhise versiooniga. Kuid nendes tulemustes võib siiski olla vigu. Kui märkate midagi, palun andke mulle sellest teada.

instagram viewer

Kolm casting operaatorit on:

  • DirectCast
  • CTüüp
  • TryCast

Praktiliselt leiate tavaliselt, et teie rakenduse nõuded määravad teie kasutatava operaatori. DirectCasti ja TryCasti nõuded on väga kitsad. DirectCasti kasutamisel peab tüüp olema juba teada. Kuigi kood ...

theString = DirectCast (theobjekt, string)

... kompileeritakse edukalt, kui objekt pole juba string, siis viskab kood käitusaja erandi välja.

TryCast on veelgi piiravam, kuna see ei tööta üldse väärtuse tüüpide (nt täisarv) korral. (String on viitetüüp. Lisateavet väärtuse tüüpide ja viitetüüpide kohta leiate selle sarja esimesest artiklist.) See kood ...

theInteger = TryCast (theobjekt, täisarv)

... isegi ei kompileeri.

TryCast on kasulik, kui te pole kindel, millist tüüpi objektiga töötate. Selle asemel, et visata sellist viga nagu DirectCast, tagastab TryCast lihtsalt midagi. Tavaliselt on pärast TryCasti käivitamist testida midagi.

Ainult CType (ja muud "teisendamise" operaatorid nagu CInt ja CBool) teisendab tüübid, millel pole pärimissuhet, näiteks täisarv, stringiks:

Timmige stringi kui stringi = "1" Tühjendage täisealine täisarv. theInteger = CType (theString, täisarv)

See töötab seetõttu, et CType kasutab nende teisenduste tegemiseks abistamisfunktsioone, mis ei kuulu .NET CLR-i (Common Language Runtime).

Kuid pidage meeles, et CType loobub ka erandist, kui String ei sisalda midagi, mida saab täisarvuks teisendada. Kui on võimalus, et string pole selline täisarv nagu ...


Dim the String As String = "George"

... siis ükski casting operaator ei tööta. Isegi TryCast ei toimi täisarvuga, kuna see on väärtuse tüüp. Sellisel juhul peate enne andmete ülekandmist kasutama andmete kontrollimiseks kehtivuskinnitust, näiteks operaator TypeOf.

Microsofti DirectCasti dokumentatsioonis mainitakse konkreetselt objekti tüüpi ülekandmist, nii et seda kasutasin oma esimeses jõudlustestis. Testimine algab järgmisel lehel!

DirectCast kasutab tavaliselt objekti tüüpi, seega kasutasin seda oma esimeses jõudlustestis. TryCasti kaasamiseks testi juurde lisasin ka If-ploki, kuna peaaegu kõigil TryCasti kasutavatel programmidel on üks. Sel juhul aga ei täideta seda kunagi.

Siin on kood, mis võrdleb kõiki kolme objekti valamisel stringi:

Uuesti stopperina timmimine () Timmige stringi kui stringi. Tühjenda theObject kui objekt = "objekt" Hämardage tegevusi täisarvuna = CInt (kordamine. Tekst) * 1000000. ' 'DirectCasti test. aeg. Algus () Sest i = 0 - vahekord. theString = DirectCast (theobjekt, string) Järgmine. aeg. Peata () DirectCastTime. Tekst = aeg. KulunudMillisekundit. ToString. ' 'CTüübi test. aeg. Taaskäivita() Sest i kui täisarv = 0 - vahekord. theString = CType (theobjekt, string) Järgmine. aeg. Peata () CTypeTime. Tekst = aeg. KulunudMillisekundit. ToString. ' 'TryCasti test. aeg. Taaskäivita() Sest i kui täisarv = 0 - vahekord. theString = TryCast (theObject, string) Kui triip pole midagi, siis. MsgBox ("Seda ei tohiks kunagi kuvada") Lõpeta If. Järgmine. aeg. Peata () TryCastTime. Tekst = aeg. KulunudMillisekundit. ToString.

See esialgne test näib näitavat, et Microsoftil on sihtmärk õige. Siin on tulemus. (Suurema ja väiksema iteratsioonide arvuga katsed ning korduvad testid erinevates tingimustes ei näidanud sellest tulemusest olulisi erinevusi.)


Illustratsiooni kuvamiseks klõpsake siin

DirectCast ja TryCast olid sarnased 323 ja 356 millisekundi jooksul, kuid CType võttis 1018 millisekundi jooksul kolm korda rohkem aega. Niisuguste võrdlustüüpide ülekandmisel maksate CType'i jõudluse paindlikkuse eest.

Kuid kas see töötab alati nii? Nende lehel olev Microsofti näide DirectCasti kohta on peamiselt kasulik teile öelda ei hakka töötage DirectCasti kasutades, mitte mis saab. Siin on Microsofti näide:

Dim q kui objekt = 2,37. Dim i kui täisarv = CTüüp (q, täisarv) 'Järgmine konversioon ebaõnnestub töö ajal. Dim j kui täisarv = DirectCast (q, täisarv) Dim f Nagu uus süsteem. Windows. Vormid. Vorm. Dim c as System. Windows. Vormid. Kontroll. Järgmine teisendus õnnestub. c = DirectCast (f, süsteem. Windows. Vormid. Kontroll)

Teisisõnu, sina ei saa kasutage objekti tüübi täisarvu valamiseks DirectCasti (või TryCasti, ehkki nad seda siin ei maini), kuid teie saab kasutage vormingutüübi kontrolltüüpi ülekandmiseks DirectCasti.

Kontrollime Microsofti näite toimivust selle kohta, mida tahe töötage DirectCastiga. Kasutage sama ülaltoodud koodimalli, asendage ...


c = DirectCast (f, süsteem. Windows. Vormid. Kontroll)

... koodi koos CType ja TryCasti sarnaste asendustega. Tulemused on pisut üllatavad.


Illustratsiooni kuvamiseks klõpsake siin

DirectCast oli kolmest valimisest 145 millisekundi jooksul aeglaseim. CType on vaid veidi kiirem 127 millisekundi jooksul, kuid TryCast, sealhulgas If-plokk, on kiireim 77 millisekundi jooksul. Proovisin kirjutada ka oma esemeid:


Klassi vanemklass... Lõpuklass. Klassi lapseklass. Pärib ParentClassi... Lõpuklass. 

Sain sarnaseid tulemusi. Näib, et kui sa oled mitte kui valite objekti tüübi, on teil parem mitte kasutades DirectCasti.

instagram story viewer