Liešana ir process konvertēt vienu datu tipu citā, piemēram, no vesela skaitļa veida uz virknes tipu. Dažas operācijas VB.NET lai darbotos, nepieciešami īpaši datu tipi. Apraide rada vajadzīgo veidu. Pirmais šīs divdaļīgās sērijas raksts “Liešana un datu veida konvertēšana VB.NET” iepazīstina ar liešanu. Šajā rakstā ir aprakstīti trīs operatori, kurus varat izmantot apraidei VB.NET - DirectCast, CType un TryCast - un salīdzina to veiktspēju.
Saskaņā ar Microsoft un citiem rakstiem veiktspēja ir viena no lielajām atšķirībām starp trim liešanas operatoriem. Piemēram, Microsoft parasti uzmanīgi brīdina, ka “DirectCast... var nodrošināt nedaudz labāku sniegumu nekā CType konvertējot uz datu tipu Object un no tā. "(Uzsvars pievienots.)
Es nolēmu uzrakstīt kādu kodu, lai pārbaudītu.
Bet vispirms piesardzības vārds. Dan Appleman, viens no tehnisko grāmatu izdevēja Apress dibinātājiem un uzticams tehniskais guru, reiz man teica, ka etalonuzdevumu veikšanu ir daudz grūtāk pareizi izdarīt nekā lielākajai daļai cilvēku realizēt. Ir tādi faktori kā mašīnas veiktspēja, citi procesi, kas varētu darboties paralēli, optimizācija piemēram, atmiņas kešatmiņā saglabāšana vai kompilatora optimizēšana, un kļūdas jūsu pieņēmumos par to, kas patiesībā ir kods darot. Šajos etalonos esmu mēģinājis novērst "ābolu un apelsīnu" salīdzināšanas kļūdas, un visi testi ir veikti ar izlaišanas versiju. Bet šajos rezultātos joprojām var būt kļūdas. Ja pamanāt, lūdzu, dariet man to zināmu.
Trīs liešanas operatori ir:
- DirectCast
- CT tips
- TryCast
Faktiski parasti jūs atradīsit, ka jūsu lietojumprogrammas prasības noteiks, kuru operatoru jūs izmantojat. DirectCast un TryCast ir ļoti šauras prasības. Lietojot DirectCast, tipam jau jābūt zināmam. Kaut arī kods ...
theString = DirectCast (objekts, virkne)
... veiksmīgi sastādīs, ja objekts jau nav virkne, tad kods parādīs izpildlaika izņēmumu.
TryCast ir vēl ierobežojošāks, jo tas nedarbosies tādos “vērtību” veidos kā Integer. (Virkne ir atsauces tips. Plašāku informāciju par vērtību tipiem un atsauces veidiem skatiet šīs sērijas pirmajā rakstā.) Šis kods ...
theInteger = TryCast (theObject, Integer)
... pat nesastādīs.
TryCast ir noderīga, ja neesat pārliecināts, ar kāda veida objektu strādājat. Tā vietā, lai izmestu tādu kļūdu kā DirectCast, TryCast vienkārši atdod neko. Parasti tiek pārbaudīts, vai nekas nav noticis pēc TryCast izpildes.
Tikai CType (un citi “Convert” operatori, piemēram, CInt un CBool) konvertēs tipus, kuriem nav mantojuma attiecību, piemēram, vesels skaitlis, uz virkni:
Aptumšot auklu kā virkni = "1" Dim theInteger as Integer. theInteger = CType (theString, Integer)
Tas darbojas tāpēc, ka CType šo reklāmguvumu veikšanai izmanto “palīgu funkcijas”, kas neietilpst .NET CLR (Common Language Runtime).
Bet atcerieties, ka CType izmetīs arī izņēmumu, ja stringā nebūs kaut kas pārveidojams par veselu skaitli. Ja pastāv iespēja, ka virkne nav vesels skaitlis kā šis ...
Dim the String As String = "Džordžs"
... tad neviens liešanas operators nedarbosies. Pat TryCast nedarbosies ar Integer, jo tas ir vērtības tips. Šādā gadījumā jums būs jāizmanto derīguma pārbaude, piemēram, TypeOf operatoram, lai pārbaudītu savus datus pirms mēģināt tos ievietot.
Microsoft DirectCast dokumentācijā ir īpaši pieminēta apraide ar objekta tipu, tāpēc es to izmantoju savā pirmajā veiktspējas testā. Pārbaude sākas nākamajā lapā!
DirectCast parasti izmantos objekta veidu, tāpēc to es izmantoju savā pirmajā veiktspējas testā. Lai testā iekļautu TryCast, es iekļāvu arī If bloku, jo gandrīz visām programmām, kuras izmanto TryCast, būs viena. Tomēr šajā gadījumā tas nekad netiks izpildīts.
Šis ir kods, kas salīdzina visus trīs, kad objekts tiek ievietots virknē:
Pielāgot laiku kā jaunu hronometru () Dim the String kā stīgu. Blāva objekta tuvināšana kā objekts = "Objekts" Ierobežot intervijas kā vesels skaitlis = CInt (atkārtojumi. Teksts) * 1000000. ' 'DirectCast pārbaude. laiks. Sākt() I = 0 līdz intervijām. theString = DirectCast (objekts, virkne) Nākamais. laiks. Pietura () DirectCastTime. Teksts = laiks. PagājisMilisekundes. ToString. ' 'CT tipa pārbaude. laiks. Restartēt() I kā vesels skaitlis = 0 intervāliem. theString = CType (theobjekts, stīga) Nākamais. laiks. Pietura () CTypeTime. Teksts = laiks. PagājisMilisekundes. ToString. ' 'TryCast tests. laiks. Restartēt() I kā vesels skaitlis = 0 intervāliem. theString = TryCast (theObject, virkne) Ja aukla nav nekas, tad. MsgBox ("To nekad nevajadzētu parādīt") Beigt ja. Nākamais. laiks. Pietura () TryCastTime. Teksts = laiks. PagājisMilisekundes. ToString.
Šis sākotnējais tests, šķiet, parāda, ka Microsoft pareizi darbojas mērķī. Lūk, rezultāts. (Eksperimenti ar lielāku un mazāku iterāciju skaitu, kā arī atkārtoti testi dažādos apstākļos neuzrādīja būtiskas atšķirības no šī rezultāta.)
Noklikšķiniet šeit, lai parādītu ilustrāciju
DirectCast un TryCast bija līdzīgi 323 un 356 milisekundēs, bet CType pārņēma trīs reizes vairāk laika 1018 milisekundēs. Veidojot šādus atsauces veidus, jūs maksājat par CType elastīgumu izpildē.
Bet vai tas vienmēr darbojas šādā veidā? Microsoft piemērs viņu lapā DirectCast galvenokārt noder, lai pastāstītu jums nebūs strādājiet, izmantojot DirectCast, nevis to, kas būs. Šis ir Microsoft piemērs:
Dim q As Object = 2.37. Dim i kā vesels skaitlis = CT tips (q, vesels skaitlis) Turpmākā konvertēšana neizdodas izpildes laikā. Dim j Kā vesels skaitlis = DirectCast (q, vesels skaitlis) Dim f kā jauna sistēma. Windows. Veidlapas. Forma. Dim c kā sistēma. Windows. Veidlapas. Kontrole. “Veiksmīga ir šāda konvertēšana. c = DirectCast (f, Sistēma. Windows. Veidlapas. Vadība)
Citiem vārdiem sakot, jūs nevar izmantojiet DirectCast (vai TryCast, kaut arī viņi to šeit nepiemin), lai objekta tipu nodotu veselam skaitlim, bet jūs var izmantojiet DirectCast, lai veidlapas tipu nodotu vadības tipam.
Pārbaudīsim, kā darbojas Microsoft piemērs būs darbs ar DirectCast. Izmantojot to pašu koda veidni, kas parādīta iepriekš, aizstājiet to ...
c = DirectCast (f, Sistēma. Windows. Veidlapas. Vadība)
... kodā kopā ar līdzīgiem CType un TryCast aizstājējiem. Rezultāti ir nedaudz pārsteidzoši.
Noklikšķiniet šeit, lai parādītu ilustrāciju
DirectCast faktiski bija vislēnākā no trim izvēlēm ar 145 milisekundēm. CType ir tikai nedaudz ātrāks ar 127 milisekundēm, bet TryCast, ieskaitot If bloku, ir ātrākais ar 77 milisekundēm. Es mēģināju uzrakstīt arī savus objektus:
Klase ParentClass... Beigu klase. Klase ChildClass. Manto ParentClass... Beigu klase.
Man līdzīgi rezultāti. Šķiet, ka, ja jūs esat nē nododot Object tipu, jums ir labāk nē izmantojot DirectCast.