2010-06-16 6 views
84

Ich bin ein erfahrener C/C++/C# -Programmierer, der gerade in VB.NET gekommen ist. Ich verwende generell CType (und CInt, CBool, CStr) für Casts, weil es weniger Zeichen gibt und war die erste Art zu Casting, der ich ausgesetzt war, aber ich kenne auch DirectCast und TryCast.Unterschied zwischen DirectCast() und CType() in VB.NET

Gibt es einfach Unterschiede zwischen DirectCast und CType (Auswirkungen von Besetzung, Leistung usw.)? Ich verstehe die Idee von TryCast.

+6

Genaue Duplikat dieser * Casting Datatypes mit Direct, CType, TryCast * http://stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast – MarkJ

+1

Mögliche Duplikat [Casting Datatypes mit Direct, CTyp, TryCast] (https: // stackoverflow.com/questions/2703585/casting-datatypes-mit-directcast-ctype-trycast) – Imad

Antwort

151

Das erste, was zu beachten ist, dass VB.NET keine direkte Analog zu C# (type)instance Casting-Mechanismus hat. Ich bringe das auf, weil es nützlich ist, das als Ausgangspunkt beim Vergleich der beiden VB.NET-Operatoren zu verwenden (und sie sind Operatoren, keine Funktionen, obwohl sie eine Funktionssemantik haben).

DirectCast() ist strenger als der C# Casting-Operator. Es erlaubt Ihnen nur zu gießen, wenn der Artikel, der gerade gecastet wird, ist der Typ, den Sie werfen. Es wird keine Konvertierung durchgeführt. So können Sie beispielsweise nicht von "Kurz" in "Int" umwandeln, wie dies bei einem C# (int) Cast der Fall ist. Sie können jedoch von einem IEnumerable in ein Array umwandeln, wenn Ihre zugrunde liegende IEnumerable Objektvariable wirklich eine Array ist. Und natürlich können Sie von Object zu irgendetwas umwandeln, vorausgesetzt, der Typ Ihrer Objektinstanz ist tatsächlich unterhalb des Darstellers in der Vererbungsstruktur.

Dies ist wünschenswert, denn das macht es schneller. Es gibt ein bisschen weniger Konvertierung und Typprüfung, die stattfinden muss.

CType() ist weniger streng als der C# Casting-Operator. Es wird Dinge wie eine Zeichenfolge in eine Ganzzahl konvertieren, die Sie nicht einfach mit einer einfachen (int) Besetzung tun können. Es hat so viel Power wie das Aufrufen von Convert.To___() in C#, wobei ___ der Zieltyp Ihrer Besetzung ist. Dies ist wünschenswert, weil es sehr leistungsfähig ist, aber diese Leistung auf Kosten der Leistung geht. — Es ist nicht so schnell wie der Cast-Operator von DirectCast() oder C#, da es ziemlich viel Arbeit zu erledigen gibt.

Im Allgemeinen sollten Sie DirectCast() bevorzugen, wenn Sie können.

Schließlich haben Sie einen Casting - Operator verpasst: TryCast(), der direkt analog zu C# as Operator ist.

+17

+1 Ich würde sagen, die Strenge von "DirectCast" ist ein weiterer Vorteil. Wenn Sie einen Fehler machen, sagt Ihnen der Compiler sofort, aber bei 'CType' kann ein Fehler nur gelegentliches falsches Verhalten zur Laufzeit verursachen - vielleicht auf einem Benutzercomputer mit anderen regionalen Einstellungen. – MarkJ

+0

Große Antwort. Also in der Reihenfolge der Komplexität (klein bis groß): 'DirectCast',' TryCast', 'CType' /' Convert.ToXYZ() ',' C () 'wäre richtig? – motto

+2

@motto - schließen. Die C () "Funktionen" sollten in der Liste höher verschoben werden, da sie tatsächlich Operatoren und keine Funktionen sind, obwohl sie eine Funktionssemantik haben. Für die Typen, die sie haben, sind sie dem C# - (Typ-) Casting sehr ähnlich, werden aber nur ein wenig mehr Arbeit leisten. –

10

Mit CType können Sie etwas wie diese schreiben Ctype("string",Integer). Aber mit DirectCast würde die obige Anweisung Kompilierzeit Fehler geben.

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

DirectCast ist viel restriktiver als CType. Zum Beispiel

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

wirft einen Fehler. Es zeigt sich auch im Visual Studio IDE. Aber

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

Hat wirft einen Fehler nicht.