Pretvorbe in pretvorbe vrst podatkov v VB.NET

Casting je najboljši postopek pretvorbe ene podatkovne vrste v drugo, na primer iz vrste Integer v vrsto String. Nekatere operacije v VB.NET za delovanje potrebujejo posebne vrste podatkov. Predvajanje ustvari vrsto, ki jo potrebujete. Prvi članek v tej dvodelni seriji Casting in Data Type Conversions v VB.NET uvaja uvajanje. Ta članek opisuje tri operaterje, s katerimi lahko igrate VB.NET - DirectCast, CType in TryCast - in primerja njihovo uspešnost.

Uspešnost je ena od velikih razlik med tremi operaterji litja po Microsoftu in drugih člankih. Microsoft je na primer ponavadi pozoren na to, da "DirectCast... lahko zagotovi nekoliko boljše delovanje kot CType pri pretvorbi v tip podatkov in iz njega. "(Poudarek dodan.)

Odločil sem se, da napišem neko kodo, da preverim.

Toda najprej previdno. Dan Appleman, eden izmed ustanoviteljev založbe tehničnih knjig Apress in zanesljiv tehničnik guru, nekoč mi je rekel, da je uspešnost primerjalne uspešnosti veliko težje narediti pravilno kot večina ljudi spoznati. Obstajajo dejavniki, kot so zmogljivost stroja, drugi procesi, ki se lahko izvajajo vzporedno, optimizacija kot je predpomnilnik pomnilnika ali optimizacija prevajalnika in napake v vaših predpostavkah o tem, kaj je pravzaprav koda početje. V teh merilih sem poskušal odpraviti napake v primerjavi "jabolk in pomaranč" in vsi testi so bili opravljeni z izdelavo izdaje. Toda v teh rezultatih je še vedno mogoče napak. Če opazite kaj, mi to sporočite.

instagram viewer

Trije izvajalci litja so:

  • DirectCast
  • CType
  • TryCast

Dejansko boste običajno ugotovili, da bodo zahteve vaše aplikacije določile, katerega operaterja uporabljate. DirectCast in TryCast imata zelo ozke zahteve. Ko uporabljate DirectCast, mora biti tip že znan. Čeprav koda ...

theString = DirectCast (theObject, niz)

... se bo uspešno sestavil, če theObject še ni niz, potem bo koda vrgla izjemo izvajanja.

TryCast je še bolj restriktiven, saj sploh ne bo deloval pri "vrednostnih" vrstah, kot je Integer. (String je referenčna vrsta. Več o vrstah vrednosti in referenčnih vrstah si oglejte v prvem članku v tej seriji.) Ta koda ...

theInteger = TryCast (theObject, Integer)

... se ne bo niti sestavil.

TryCast je uporaben, kadar niste prepričani, s kakšnim tipom predmeta delate. Namesto da bi vrgel napako, kot je DirectCast, TryCast samo vrne nič. Običajna praksa je, da po izvajanju TryCast preverite, ali ni nič.

Samo CType (in drugi operaterji »Pretvori«, kot sta CInt in CBool) bodo pretvorili vrste, ki nimajo dednega razmerja, kot je Integer, v niz:

ZatemniString kot niz = "1" Zatemnite Integer kot Integer. theInteger = CType (theString, Integer)

To deluje, ker CType za izvajanje teh pretvorb uporablja "pomožne funkcije", ki niso del .NET CLR (Common Language Runtime).

Ne pozabite pa, da bo CType vrgel tudi izjemo, če TheString ne vsebuje nekaj, kar je mogoče pretvoriti v Integer. Če obstaja možnost, da niz ni celo število, kot je ta ...


ZatemniString kot niz = "George"

... potem noben operater vlivanja ne bo deloval. Tudi TryCast ne bo sodeloval z Integerjem, ker je vrsta vrednosti. V takem primeru bi morali preveriti veljavnost, na primer operater TypeOf, da preverite svoje podatke, preden jih poskusite oddati.

Microsoftova dokumentacija za DirectCast posebej omenja uvajanje s tipom Object, tako da sem uporabil v prvem preizkusu zmogljivosti. Testiranje se začne na naslednji strani!

DirectCast ponavadi uporablja tip predmeta, tako da sem to uporabil v svojem prvem testu zmogljivosti. Če želite v test vključiti TryCast, sem vključil tudi blok If, saj ga bo imel skoraj vsi programi, ki uporabljajo TryCast. V tem primeru pa se ne bo nikoli izvršil.

Tu je koda, ki primerja vse tri med predvajanjem predmeta v niz:

Zatemnite čas kot novo štoparico () Zatemnite struno kot niz. ZatemniObject As Object = "Predmet" Zatemnite oznake kot celo število = CInt (Iteracije. Besedilo) * 1000000. ' 'Test DirectCast. čas. Začetek () Za i = 0 k Iteracijam. theString = DirectCast (theObject, niz) Naslednji. čas. Stop () DirectCastTime. Besedilo = čas. Iztekle milisekunde ToString. ' 'CType test. čas. Ponovni zagon() Za i kot celo število = 0 k navedbam. theString = CType (theObject, String) Naslednji. čas. Stop () CTypeTime. Besedilo = čas. Iztekle milisekunde ToString. ' 'Test preizkušanja. čas. Ponovni zagon() Za i kot celo število = 0 k navedbam. theString = TryCast (theObject, niz) Če struna ni potem. MsgBox ("To se nikoli ne sme prikazati") Konec Če. Naslednji. čas. Stop () TryCastTime. Besedilo = čas. Iztekle milisekunde ToString.

Zdi se, da je ta začetni test pokazal, da je Microsoft pravi cilj. Tu je rezultat. (Poskusi z večjim in manjšim številom ponovitev ter ponovljeni testi pod različnimi pogoji niso pokazali pomembnih razlik od tega rezultata.)


Kliknite tukaj, če želite prikazati ilustracijo

DirectCast in TryCast sta bila podobna pri 323 in 356 milisekundah, toda CType je pri 1018 milisekundah prevzel trikrat več časa. Pri vnašanju takšnih referenčnih tipov plačujete za prilagodljivost CType-a pri uspešnosti.

Toda, ali vedno deluje tako? Microsoftov primer na njihovi strani za DirectCast je koristen predvsem za to, da vam povemo, kaj ne bo delajte z DirectCastom, ne, kaj bo. Tu je primer Microsofta:

Dim q kot predmet = 2,37. Dim i as Integer = CType (q, celo število) "Naslednja pretvorba ne uspe v času izvajanja. Dim j kot Integer = DirectCast (q, celo število) Zatemni kot nov sistem. Windows. Obrazci. Oblika. Dim c kot sistem. Windows. Obrazci. Nadzor. „Naslednja pretvorba je uspešna. c = DirectCast (f, sistem. Windows. Obrazci. Nadzor)

Z drugimi besedami, ti ne more uporabite DirectCast (ali TryCast, čeprav ga tukaj ne omenjajo), če želite oddati tip predmeta v tip Integer, vendar lahko uporabite DirectCast za dodelitev vrste obrazca v tip nadzora.

Preverimo uspešnost Microsoftovega primera kaj volja sodelovati z DirectCastom. Z isto predlogo kode, prikazano zgoraj, nadomestite ...


c = DirectCast (f, sistem. Windows. Obrazci. Nadzor)

... v kodo skupaj s podobnimi nadomestki za CType in TryCast. Rezultati so nekoliko presenetljivi.


Kliknite tukaj, če želite prikazati ilustracijo

DirectCast je bil pravzaprav najbolj počasen od treh odločitev v 145 milisekundah. CType je le hitrejši pri 127 milisekundah, vendar je TryCast, vključno z blokom If, najhitrejši pri 77 milisekundah. Poskusil sem tudi s pisanjem lastnih predmetov:


Razred ParentClass... Končni razred. Razred ChildClass. Podeduje ParentClass... Končni razred. 

Dobila sem podobne rezultate. Kaže, da če si ne kasting vrste predmeta, vam je bolje ne z uporabo DirectCast-a.