Perdavimas ir duomenų tipo konvertavimas VB.NET

Liejimas yra procesas konvertuoti vieną duomenų tipą į kitą, pavyzdžiui, iš sveikojo skaičiaus tipo į eilutės tipą. Kai kurios operacijos VB.NET norint dirbti, reikia konkrečių duomenų tipų. Laidos sukuria jums reikiamą tipą. Pirmasis šios dviejų dalių serijos straipsnis „Liejimas ir duomenų tipo konvertavimas VB.NET“ pristato liejimą. Šiame straipsnyje aprašomi trys operatoriai, kuriuos galite naudoti prisijungdami VB.NET - „DirectCast“, „CType“ ir „TryCast“ - ir lygina jų veikimą.

Našumas yra vienas iš didelių skirtumų tarp trijų liejimo operatorių, kaip teigia „Microsoft“ ir kiti straipsniai. Pavyzdžiui, „Microsoft“ paprastai atsargiai įspėja, kad „DirectCast... gali užtikrinti šiek tiek geresnį našumą nei CType konvertuojant į duomenų tipą Object ir iš jo. “(Pabrėžta.)

Aš nusprendžiau parašyti kokį nors kodą patikrinti.

Bet pirmiausia atsargiai. Danas Applemanas, vienas iš techninių knygų leidyklos „Apress“ įkūrėjų ir patikimas technikas guru, kartą man pasakė, kad etalonų analizę atlikti yra daug sunkiau, nei daugumai žmonių suvokti. Yra tokie veiksniai kaip mašinos našumas, kiti procesai, kurie gali vykti lygiagrečiai, optimizavimas pvz., atminties talpyklos kaupimą ar kompiliatoriaus optimizavimą ir klaidų prielaidose apie tai, koks yra kodas daro. Šiuose gairėse aš bandžiau pašalinti „obuolių ir apelsinų“ palyginimo klaidas ir visi bandymai buvo atlikti su leidimo versija. Bet vis tiek gali būti klaidų šiuose rezultatuose. Jei pastebėjote ką nors, praneškite man.

instagram viewer

Trys liejimo operatoriai yra šie:

  • „DirectCast“
  • CT tipas
  • „TryCast“

Praktiškai paprastai pastebėsite, kad jūsų programos reikalavimai lems, kurį operatorių naudojate. „DirectCast“ ir „TryCast“ reikalavimai yra labai siauri. Kai naudojate „DirectCast“, tipas turi būti jau žinomas. Nors kodas ...

theString = „DirectCast“ („TheObject“, „String“)

... bus sėkmingai sukompiliuotas, jei objektas dar nėra eilutė, tada kodas bus paleistas vykdymo laiko išimtimi.

„TryCast“ yra dar labiau ribojantis, nes jis visiškai neveiks „vertės“ tipų, tokių kaip sveikasis skaičius. (Styga yra pamatinis tipas. Norėdami sužinoti daugiau apie vertės ir nuorodų tipus, skaitykite pirmąjį šios serijos straipsnį.) Šis kodas ...

theInteger = TryCast („objektas“, sveikasis skaičius)

... net nekompiliuos.

„TryCast“ yra naudinga, kai nežinote, su kokio tipo objektu dirbate. Užuot išmetęs tokią klaidą kaip „DirectCast“, „TryCast“ tiesiog grąžina nieko. Įprasta yra išbandyti, ar nieko nėra atlikus „TryCast“.

Tik CType (ir kiti „Konvertuoti“ operatoriai, tokie kaip CInt ir CBool) konvertuos tipus, kurie neturi paveldėjimo santykio, pvz., Sveikasis skaičius, į eilutę:

Pritemdyti juostą kaip eilutę = "1" Sumažinkite „Integer“ kaip sveiką skaičių. theInteger = CType (eilutė, sveikasis skaičius)

Tai veikia, nes „CType“ šioms konversijoms atlikti naudoja „pagalbines funkcijas“, kurios nėra .NET CLR (Common Language Runtime) dalis.

Tačiau atminkite, kad „CType“ taip pat išmes išimtį, jei „String“ nėra kažko, ką būtų galima konvertuoti į sveikąjį skaičių. Jei yra tikimybė, kad eilutė nėra sveikas skaičius kaip šis ...


Dim the String As Styga = "George"

... tada neveikia joks operatorius. Net „TryCast“ neveiks su sveiku skaičiumi, nes tai vertės tipas. Tokiu atveju, prieš bandydami atiduoti duomenis, turėtumėte naudoti galiojimo tikrinimą, pavyzdžiui, „TypeOf“ operatorių.

„Microsoft“ dokumentuose, skirtuose „DirectCast“, konkrečiai paminėtas perdavimas naudojant „Object“ tipą, taigi tai aš ir panaudojau atlikdamas pirmąjį našumo testą. Testavimas prasideda kitame puslapyje!

„DirectCast“ paprastai naudos objekto tipą, todėl būtent tai ir panaudojau atlikdamas pirmąjį našumo testą. Norėdami įtraukti „TryCast“ į testą, aš taip pat įtraukiau „If“ bloką, nes beveik visos programos, kurios naudoja „TryCast“, turės vieną. Tačiau tokiu atveju jis niekada nebus įvykdytas.

Štai kodas, kuris lygina visus tris, kai mesti objektą į eilutę:

Sumažinkite „The Time As New Stopwatch“ () Dim the String kaip stygos. Sumažinti objekto kaip objekto reikšmę = "Objekto" Sumažinkite pasikartojimus kaip sveikas = CInt (pakartojimai. Tekstas) * 1000000. ' „„ DirectCast “testas. Laikas. Pradėti () Jei i = 0 - tarpininkavimas. theString = „DirectCast“ („TheObject“, „String“) Kitas. Laikas. Sustabdyti() „DirectCastTime“. Tekstas = Laikas. Prabėgo milisekundės. „ToString“. ' 'CT tipo testas. Laikas. Perkrauti() „I“, kaip sveikasis skaičius = 0, kad būtų pakartotas. theString = CType (objektas, eilutė) Kitas. Laikas. Sustabdyti() CTypeTime. Tekstas = Laikas. Prabėgo milisekundės. „ToString“. ' „TryCast“ testas. Laikas. Perkrauti() „I“, kaip sveikasis skaičius = 0, kad būtų pakartotas. theString = TryCast („TheObject“, „String“) Jei juostos nėra nieko, tada. „MsgBox“ („Tai niekada neturėtų būti rodoma“) Pabaiga Jei. Kitas. Laikas. Sustabdyti() „TryCastTime“. Tekstas = Laikas. Prabėgo milisekundės. „ToString“.

Atrodo, kad šis pradinis testas rodo, kad „Microsoft“ teisingai taiko tikslą. Štai rezultatas. (Eksperimentai su didesniu ir mažesniu iteracijų skaičiumi, taip pat pakartoti bandymai skirtingomis sąlygomis neparodė jokių reikšmingų skirtumų nuo šio rezultato.)


Spustelėkite čia, norėdami pamatyti iliustraciją

„DirectCast“ ir „TryCast“ buvo panašūs 323 ir 356 milisekundėmis, tačiau CType užėmė tris kartus daugiau laiko, kai 1018 milisekundžių. Kai renkate tokius etaloninius tipus, jūs mokate už CType lankstumą atlikimo metu.

Bet ar ji visada veikia taip? „Microsoft“ pavyzdys jų puslapyje „DirectCast“ yra daugiausia naudingas norint pasakyti ką nebus dirbti naudojant „DirectCast“, o ne tai, kas bus. Štai „Microsoft“ pavyzdys:

Dim q kaip objektas = 2,37. Dim i kaip sveikasis = CT tipas (q, sveikasis skaičius) „Konversija nepavyksta vykdymo metu. Dim j kaip sveikasis skaičius = „DirectCast“ (q, sveikasis skaičius) Dim f Kaip nauja sistema. „Windows“. Formos. Forma. Dim c As Sistema. „Windows“. Formos. Kontrolė. „Šis pakeitimas pavyksta. c = „DirectCast“ (f, sistema. „Windows“. Formos. Kontrolė)

Kitaip tariant, tu negaliu naudokite „DirectCast“ (arba „TryCast“, nors jie čia to nemini), kad objekto tipą parinktumėte į sveikojo skaičiaus tipą, tačiau jūs gali naudokite „DirectCast“, kad pasirinktumėte formos tipą į „Control“ tipą.

Patikrinkime, kaip veikia „Microsoft“ pavyzdys bus dirbti su „DirectCast“. Naudodamiesi tuo pačiu aukščiau parodytu kodo šablonu, pakeiskite ...


c = „DirectCast“ (f, sistema. „Windows“. Formos. Kontrolė)

... į kodą kartu su panašiais CType ir TryCast pakaitalais. Rezultatai šiek tiek stebina.


Spustelėkite čia, norėdami pamatyti iliustraciją

„DirectCast“ iš tikrųjų buvo lėčiausias iš trijų pasirinkimų, esant 145 milisekundėms. CT tipas yra tik šiek tiek greitesnis nei 127 milisekundžių, tačiau „TryCast“, įskaitant „If“ bloką, yra greičiausias per 77 milisekundžių. Aš taip pat bandžiau rašyti savo objektus:


Class ParentClass... Pabaigos klasė. Klasės „ChildClass“. Paveldėja „ParentClass“... Pabaigos klasė. 

Gavau panašių rezultatų. Atrodo, kad jei tu ne atrenkant objekto tipą, tau geriau ne naudojant „DirectCast“.