Info

Rolverdeling en datatipe-omskakelings in VB.NET

Rolverdeling en datatipe-omskakelings in VB.NET


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Rolverdeling is die proses om een ​​datatipe na 'n ander te omskep, byvoorbeeld van 'n Integer-tipe na 'n String-tipe. Sommige bewerkings in VB.NET benodig spesifieke datatipes. Rolverdeling skep die tipe wat u benodig. Die eerste artikel in hierdie tweedelige reeks, Casting and Data Type Conversions in VB.NET, stel rolverdeling bekend. Hierdie artikel beskryf die drie operateurs wat u kan gebruik om VB.NET uit te saai - DirectCast, CType en TryCast - en vergelyk hul prestasies.

Prestasie is volgens Microsoft en ander artikels een van die groot verskille tussen die drie beslissende operateurs. Byvoorbeeld, Microsoft is gewoonlik versigtig om te waarsku dat, "DirectCast ... ietwat beter werkverrigting as CType kan lewer by die omskakeling na en van datatipe Object. "(Klem bygevoeg.)

Ek het besluit om 'n kode te skryf om na te gaan.

Maar eers 'n woord van omsigtigheid. Dan Appleman, een van die stigters van Apress en 'n betroubare tegniese ghoeroe, het my eenkeer gesê dat prestasie met die maatstaf baie moeiliker is om korrek te doen as wat die meeste mense besef. Daar is faktore soos masjienprestasie, ander prosesse wat parallel kan loop, optimalisering soos geheue-geheue of samestelleroptimalisering, en foute in u aannames oor wat die kode eintlik doen. In hierdie maatstawwe het ek probeer om vergelykingsfoute met 'appels en lemoene' uit te skakel en al die toetse is uitgevoer met die vrystelling. Daar kan egter steeds foute in hierdie resultate wees. Laat weet my asb.

Die drie rolverdelers is:

  • DirectCast
  • CType
  • TryCast

In werklikheid sal u gewoonlik sien dat die vereistes van u aansoek sal bepaal watter operateur u gebruik. DirectCast en TryCast het baie nou vereistes. As u DirectCast gebruik, moet die tipe reeds bekend wees. Alhoewel die kode ...

theString = DirectCast (theObject, String)

... sal suksesvol saamgestel word as theObject nog nie 'n string is nie, dan sal die kode 'n uitsondering van die tydsduur gooi.

TryCast is selfs meer beperkend omdat dit glad nie op "waarde" -tipes soos heelgetal werk nie. (String is 'n verwysingstipe. Raadpleeg die eerste artikel in hierdie reeks vir meer inligting oor waardesoorte en verwysingstipes.) Hierdie kode ...

theInteger = TryCast (theObject, Integer)

... sal nie eers saamstel nie.

TryCast is nuttig as u nie seker is watter tipe voorwerp u mee werk nie. Eerder as om 'n fout soos DirectCast te gooi, gee TryCast net niks terug nie. Die normale praktyk is om na Niks te toets nadat u TryCast uitgevoer het.

Slegs CType (en die ander "Convert" -operateurs soos CInt en CBool) sal soorte omskakel wat nie 'n erfenisverhouding het nie, soos 'n heelgetal na 'n string:

Dim theString as string = "1" Dim theInteger as heelgetal theInteger = CType (theString, heelgetal)

Dit werk omdat CType "helperfunksies" gebruik wat nie deel uitmaak van .NET CLR (Common Language Runtime) om hierdie omskakelings uit te voer nie.

Maar onthou dat CType ook 'n uitsondering sal maak as die String nie iets bevat wat na 'n heelgetal omgeskakel kan word nie. As die moontlikheid bestaan ​​dat die string nie 'n heelgetal soos hierdie is nie ...

Dim theString As String = "George"

… Dan sal geen beslissende operateur werk nie. Selfs TryCast sal nie met Integer werk nie, want dit is 'n waardetipe. In 'n geval soos hierdie, moet u geldigheidskontrole, soos die TypeOf-operateur, gebruik om u data na te gaan voordat u dit probeer uitwerp.

In Microsoft se dokumentasie vir DirectCast word spesifiek verwys na rolverdeling met 'n objek-tipe, so dit is wat ek in my eerste uitvoeringstoets gebruik het. Toets begin op die volgende bladsy!

DirectCast sal gewoonlik 'n objektipe gebruik, so dit is wat ek in my eerste uitvoeringstoets gebruik het. Om TryCast by die toets in te sluit, het ek ook 'n If-blok ingesluit, aangesien byna alle programme wat TryCast gebruik, een sal hê. In hierdie geval sal dit egter nooit uitgevoer word nie.

Hier is die kode wat al drie vergelyk wanneer u 'n voorwerp na 'n snaar giet:

Dim theTime as nuwe stophorlosie () Dim theString as string Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (Iterations.Text) * 1000000 "DirectCast Test theTime.Start () For i = 0 To theIterations theString = DirectCast (theObject, String) Next theTime.Stop () DirectCastTime.Text = theTime.ElapsedMilliseconds.ToString "CType Test theTime.Restart () For i As Integer = 0 To theIterations theString = CType (theObject, String) Next theTime.Stop ( CTypeTime.Text = theTime.ElapsedMilliseconds.ToString "TryCast Test theTime.Restart () For i As Integer = 0 To theIterations theString = TryCast (theObject, String) If theString Is Nothing Dan MsgBox (" This should never display ") End If Next theTime.Stop () TryCastTime.Text = theTime.ElapsedMilliseconds.ToString

Hierdie aanvanklike toets blyk te wys dat Microsoft op die regte punt is. Hier is die resultaat. (Eksperimente met groter en kleiner aantal iterasies sowel as herhaalde toetse onder verskillende toestande het geen noemenswaardige verskille van hierdie resultaat getoon nie.)

--------
Klik hier om die illustrasie weer te gee
--------

DirectCast en TryCast was dieselfde op 323 en 356 millisekondes, maar CType het drie keer soveel tyd op 1018 millisekondes geneem. As u verwysingstipes soos hierdie giet, betaal u vir die buigsaamheid van CType in die uitvoering.

Maar werk dit altyd so? Die Microsoft-voorbeeld op hul bladsy vir DirectCast is veral nuttig om jou te vertel wat sal nie werk met behulp van DirectCast, nie wat sal doen nie. Hier is die Microsoft-voorbeeld:

Dim q As voorwerp = 2,37 Dim i as heelgetal = CType (q, heelgetal) 'Die volgende omskakeling misluk tydens looptyd Dim j As heelgetal = DirectCast (q, heelgetal) Dim f As nuwe stelsel.Windows.Forms.Form Dim c As Stelsel.Windows.Forms.Control 'Die volgende omskakeling slaag. c = DirectCast (f, System.Windows.Forms.Control)

Met ander woorde, jy kan nie gebruik DirectCast (of TryCast, hoewel hulle dit nie hier noem nie) om 'n objekstipe na 'n heelgetal-tipe te werp, maar kan gebruik DirectCast om 'n vormtipe na 'n beheertipe uit te gooi.

Kom ons kyk na die prestasie van Microsoft se voorbeeld van wat sal werk met DirectCast. Gebruik dieselfde kodesjabloon hierbo en vervang ...

c = DirectCast (f, System.Windows.Forms.Control)

... in die kode saam met soortgelyke vervangings vir CType en TryCast. Die resultate is 'n bietjie verrassend.

--------
Klik hier om die illustrasie weer te gee
--------

DirectCast was eintlik die traagste van die drie keuses op 145 millisekondes. CType is net 'n bietjie vinniger op 127 millisekondes, maar TryCast, insluitend 'n If-blok, is die vinnigste op 77 millisekondes. Ek het ook probeer om my eie voorwerpe te skryf:

Klas OuerKlas… Eindklas Kinderklas Erfenis OuerKlas… Eindklas

Ek het soortgelyke resultate gekry. Dit blyk dat as u nie gooi 'n objek tipe, is jy beter daaraan toe nie met behulp van DirectCast.


Kyk die video: NET TV LIVE NOVEMBER 2019 (Junie 2022).


Kommentaar:

  1. Mazahn

    Ek het so iets gehoor, maar nie in so 'n detail nie, maar waar het u die materiaal vandaan gekry?

  2. Malazahn

    En hoe om te herformuleer?

  3. Aingeru

    Wat 'n lekker sin



Skryf 'n boodskap