Verschil tussen DirectCast() en CType() in VB.NET

Ik ben een ervaren C/C++/C# programmeur die net is begonnen met VB.NET. Ik gebruik over het algemeen CType (en CInt, CBool, CStr) voor casts omdat het minder tekens bevat en het de eerste manier van casten was waaraan ik werd blootgesteld, maar ik ken ook DirectCast en TryCast.

Simpelweg, zijn er verschillen (effect van cast, prestaties, enz.) tussen DirectCast en CType? Ik begrijp het idee van TryCast.


Antwoord 1, autoriteit 100%

Het eerste dat opvalt is dat VB.NET geen directe analogie heeft met het (type)instance-castmechanisme van C#. Ik breng dit naar voren omdat het handig is als startpunt en algemene referentie bij het vergelijken van de twee VB.NET-operators (en het zijn operators, geen functies, ook al hebben ze functiesemantiek).

DirectCast()is strenger dan de cast-operator C#. Je kunt alleen casten als het item dat alwordt gecast, het type is waarnaar je cast. Ik geloof dat het nog steeds waardetypes zal unboxen, maar anders zal het geen conversie uitvoeren. U kunt bijvoorbeeld niet van shortnaar intcasten, zoals u zou kunnen met een C# (int)-cast. Maar u kunt van een IEnumerablenaar een array casten, als uw onderliggende IEnumerableobjectvariabele echt een Arrayis. En natuurlijk kun je van Objectnaar alles casten, ervan uitgaande dat het type van je objectinstantie echt ergens onder je casttype in de overervingsstructuur ligt.

Dit is wenselijk omdat het veel snelleris. Er hoeft minder conversie en typecontrole plaats te vinden.

CType()is minder strikt dan de C#-casting-operator. Het zal dingen doen die je gewoon niet kunt doen met een simpele (int)-stijl cast, zoals een string converteren naar een geheel getal. Het heeft evenveel kracht als het aanroepen van Convert.To___()in C#, waarbij de ___het doeltype van je cast is.

Dit is wenselijk omdat het erg krachtig is. Deze kracht gaat echter ten koste van de prestaties; het is niet zo snel als DirectCast()of de cast-operator van C#, omdat het behoorlijk wat werk kan verzetten om de cast te voltooien. Over het algemeen zou je de voorkeur moeten geven aan DirectCast()wanneer je kunt.

Ten slotte heb je één casting-operator gemist: TryCast(), wat een directe analogie is met de as-operator van C#.


Antwoord 2, autoriteit 6%

Met CTypekun je iets schrijven als Ctype("string",Integer). Maar met DirectCastzou het bovenstaande statement een compile time-fout geven.

Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

Antwoord 3

DirectCastis restrictiever dan CType.

Dit geeft bijvoorbeeld een foutmelding:

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

Het wordt ook getoond in de Visual Studio IDE.

Dit geeft echter geen foutmelding:

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

Other episodes