A casting az folyamat az egyik adattípus konvertálása egy másikba, például egész számtípusból karakterlánc típusmá. Néhány művelet itt: VB.NET megköveteli a specifikus adattípusok működését. Az casting megteremti a kívánt típust. A két részből álló sorozat első cikke, az casting és az adattípus-konvertálás a VB.NET-ben, bemutatja az castingot. Ez a cikk azt a három operátort írja le, amellyel bejuthat VB.NET - DirectCast, CType és TryCast - és összehasonlítja teljesítményüket.
A teljesítmény és a Microsoft és más cikkek szerint az egyik nagy különbség a három casting operátor között. Például a Microsoft általában óvatosan figyelmezteti, hogy "DirectCast... valamivel jobb teljesítményt nyújthat, mint a CType az Object adattípusra konvertáláskor. "(Kiemelés tőlem.)
Úgy döntöttem, hogy írok néhány kódot az ellenőrzéshez.
De először egy óvatos szót. Dan Appleman, az Apress műszaki könyvkiadó egyik alapítója és megbízható műszaki szakember guru, egyszer azt mondta nekem, hogy a teljesítményértékelés teljesítményét sokkal nehezebb helyesen elvégezni, mint a legtöbb embernél Rájön. Vannak olyan tényezők, mint a gép teljesítménye, más folyamatok, amelyek párhuzamosan futhatnak, optimalizálás mint például a memória gyorsítótárazása vagy a fordító optimalizálása, valamint a kód valódi kódjával kapcsolatos feltételezéseiben szereplő hibák csinál. Ezekben a referenciaértékekben megpróbáltam kiküszöbölni az "alma és a narancs" összehasonlítási hibákat, és minden tesztet a kiadás összeállításával futtattam. De ezekben az eredményekben továbbra is lehetnek hibák. Ha észlel valamit, kérjük, ossza meg.
A három casting operátor:
- DirectCast
- ctype
- TryCast
A gyakorlatban általában azt tapasztalja, hogy alkalmazásának követelményei határozzák meg, hogy melyik operátort használja. A DirectCast és a TryCast nagyon szűk követelményekkel rendelkezik. A DirectCast használatakor a típusnak már ismertnek kell lennie. Bár a kód ...
theString = DirectCast (theObject, String)
... sikeresen összeállítja, ha az TheObject még nem karakterlánc, akkor a kód futási kivételt jelenít meg.
A TryCast még korlátozóbb, mert egyáltalán nem fog működni olyan "érték" típusokon, mint az egész szám. (A karakterlánc referencia típus. Az érték- és referenciatípusokról bővebben a sorozat első cikkében olvashat.) Ez a kód ...
theInteger = TryCast (theObject, egész szám)
... még nem is fordítja.
A TryCast akkor hasznos, ha nem biztos abban, hogy milyen típusú objektummal dolgozik. Ahelyett, hogy olyan hibát dobna el, mint a DirectCast, a TryCast csak a Semmi értéket adja vissza. A szokásos módszer a Semmi tesztelése a TryCast végrehajtása után.
Csak a CType (és a többi "Konvertálás" operátor, például a CInt és a CBool) konvertál olyan típusokat, amelyek nem rendelkeznek öröklési kapcsolatokkal, például egész számmal, egy karakterlánccá:
A sáv tompítása mint karakterlánc = "1" Halványítsa meg azInteger egész számot. theInteger = CType (theString, egész szám)
Ez azért működik, mert a CType "segítő funkciókat" használ, amelyek nem képezik a .NET CLR (Common Language Runtime) részét az átalakítások végrehajtásához.
De ne feledje, hogy a CType kivételt fog tenni, ha a sztring nem tartalmaz valamit, amelyet egészre konvertálhat. Ha van egy esély, hogy a karakterlánc nem olyan egész szám, mint ez ...
Dim theString As String = "George"
... akkor egyetlen casting operátor sem fog működni. Még a TryCast sem fog működni az egész számmal, mert ez egy értéktípus. Ilyen esetben érvényességi ellenőrzést kell végeznie, például a TypeOf operátorral, hogy ellenőrizze adatait, mielőtt átadná azokat.
A Microsoft DirectCast dokumentációja kifejezetten megemlíti az objektumtípussal történő átküldést, tehát ezt használtam az első teljesítményteszt során. A tesztelés a következő oldalon kezdődik!
A DirectCast általában objektumtípust fog használni, tehát ezt használtam az első teljesítményteszt során. A TryCast tesztbe való beépítéséhez egy If blokkot is belefoglaltam, mivel szinte minden, a TryCastot használó programnak van ilyenje. Ebben az esetben azonban soha nem hajtják végre.
Íme a kód, amely összehasonlítja mind a három képet, amikor egy objektumot egy karakterlángra dobunk:
A timimeket új stopperként tompítani () A sáv tompítása húrosként. Dim theObject mint objektum = "egy objektum" Ellenőrizze az interferenciákat egész számként = CInt (Iterációk. Szöveg) * 1000000. ' 'DirectCast teszt. az idő. Rajt() Mert i = 0 Az interferenciákhoz. theString = DirectCast (theObject, String) Következő. az idő. Állj meg() DirectCastTime. Szöveg = az idő. ElapsedMilliseconds. ToString. ' 'CType teszt. az idő. Újrakezd() Mert egész számként = 0 az interferenciákhoz. theString = CType (theObject, String) Következő. az idő. Állj meg() CTypeTime. Szöveg = az idő. ElapsedMilliseconds. ToString. ' 'TryCast teszt. az idő. Újrakezd() Mert egész számként = 0 az interferenciákhoz. theString = TryCast (theObject, Karakterlánc) Ha a csík semmi, akkor. MsgBox ("Ez soha nem jelenhet meg") Vége If. Következő. az idő. Állj meg() TryCastTime. Szöveg = az idő. ElapsedMilliseconds. ToString.
Ez a kezdeti teszt úgy tűnik, hogy megmutatja, hogy a Microsoft helyesen áll a cél felé. Itt az eredmény. (Nagyobb és kisebb számú iterációval végzett kísérletek, valamint az ismételt tesztek különböző körülmények között nem mutattak szignifikáns eltérést ettől az eredménytől.)
Kattintson ide az ábra megjelenítéséhez
A DirectCast és a TryCast 323 és 356 milliszekundumban hasonlóak voltak, de a CType háromszor annyi időt vett igénybe 1018 milliszekundumon. Ilyen referenciatípusok leadásakor fizetni kell a CType rugalmasságáért a teljesítményben.
De mindig így működik? A DirectCast oldalukon található Microsoft példa elsősorban arról szól, hogy megmondja mit szokás dolgozzon a DirectCast használatával, nem pedig mi lesz. Itt van a Microsoft példája:
Dim q As Object = 2,37. Dim i egészként = CT típus (q, egész) 'A következő átalakítás sikertelen futási idő alatt. Dim j Mint egész = DirectCast (q, egész) Dim f as new system. Ablakok. Formákat. Forma. Dim c As System. Ablakok. Formákat. Ellenőrzés. 'A következő átalakítás sikeres. c = DirectCast (f, Rendszer. Ablakok. Formákat. Ellenőrzés)
Más szavakkal, te nem tud használja a DirectCast (vagy a TryCast alkalmazást, bár itt nem említik meg) az Objektumtípus egész számra történő megadásához, de Ön tud használja a DirectCast-t az űrlaptípus vezérlőtípusba történő átadására.
Ellenőrizzük a Microsoft példájának teljesítményét akarat dolgozzon a DirectCast-tal. A fent látható ugyanazon kódsablon használatával cserélje ...
c = DirectCast (f, Rendszer. Ablakok. Formákat. Ellenőrzés)
... a kódba, a CType és a TryCast hasonló helyettesítéseivel együtt. Az eredmények kissé meglepőek.
Kattintson ide az ábra megjelenítéséhez
A DirectCast valójában a leglassabb volt a három választás közül, 145 milliszekundummal. A CType csak kissé gyorsabb, 127 milliszekundum alatt, de a TryCast, beleértve az If blokkot, a leggyorsabb 77 milliszekundumon. Megpróbáltam saját tárgyakat is írni:
Class ParentClass... Végkategória. Class ChildClass. Örököli a ParentClassot... Végkategória.
Hasonló eredményeket kaptam. Úgy tűnik, hogy ha te vagy nem ha objektumtípust dobsz, akkor jobban tudsz nem a DirectCast használatával.