Ich bin ein erfahrener C / C ++ / C # -Programmierer, der gerade in VB.NET eingestiegen ist. Im Allgemeinen verwende ich CType (und CInt, CBool, CStr) für Casts, da es weniger Zeichen enthält und die erste Art des Castings war, der ich ausgesetzt war, aber ich kenne auch DirectCast und TryCast.
Gibt es einfach Unterschiede (Auswirkung von Besetzung, Leistung usw.) zwischen DirectCast und CType? Ich verstehe die Idee von TryCast.
vb.net
ctype
directcast
Caleb Herd
quelle
quelle
Antworten:
Das erste, was zu beachten ist, ist, dass VB.NET kein direktes Analogon zum
(type)instance
Casting-Mechanismus von C # hat . Ich spreche dies an, weil es als Ausgangspunkt für den Vergleich der beiden VB.NET-Operatoren nützlich ist (und sie sind Operatoren, keine Funktionen, obwohl sie eine Funktionssemantik haben).DirectCast()
ist strenger als der C # Casting-Operator. Sie können nur wirken, wenn der Gegenstand, auf den bereits gewirkt wird, der Typ ist, auf den Sie wirken. Ich glaube, es werden immer noch Werttypen entpackt, aber sonst wird keine Konvertierung durchgeführt. So können Sie beispielsweise nicht wie bei einem C # -Guss vonshort
bis umwandeln. Sie können jedoch von einem in ein Array umwandeln, wenn Ihre zugrunde liegende Objektvariable wirklich eine ist . Und natürlich können Sie von in alles umwandeln, vorausgesetzt, der Typ Ihrer Objektinstanz liegt tatsächlich irgendwo unter Ihrem Umwandlungstyp im Vererbungsbaum.int
(int)
IEnumerable
IEnumerable
Array
Object
Dies ist wünschenswert, weil es viel schneller ist . Es müssen weniger Konvertierungs- und Typprüfungen durchgeführt werden.
CType()
ist weniger streng als der C # Casting-Operator. Es wird Dinge tun, die Sie mit einer einfachen(int)
Besetzung einfach nicht tun können , wie das Konvertieren einer Zeichenfolge in eine Ganzzahl. Es hat so viel Kraft wie das AufrufenConvert.To___()
von C #, wobei das___
der Zieltyp Ihrer Besetzung ist.Dies ist wünschenswert, weil es sehr mächtig ist. Diese Leistung geht jedoch zu Lasten der Leistung. Es ist nicht so schnell wie der
DirectCast()
Cast-Operator von oder C #, da es möglicherweise ziemlich viel Arbeit erfordert, um den Cast zu beenden. Im Allgemeinen sollten Sie es vorziehen,DirectCast()
wenn Sie können.Schließlich haben Sie einen Casting-Operator verpasst:: Dies
TryCast()
ist ein direktes Analogon zumas
Operator von C # .quelle
DirectCast
ist ein weiterer Vorteil. Wenn Sie einen Fehler machen, werden Sie vom Compiler sofort benachrichtigt. BeiCType
einem Fehler kann es jedoch gelegentlich zu einem falschen Verhalten zur Laufzeit kommen - möglicherweise auf einem Benutzercomputer mit unterschiedlichen regionalen Einstellungen.DirectCast
,TryCast
,CType
/Convert.ToXYZ()
,C<xyz>()
wäre richtig?DirectCast
gilt nur für Klassen, nicht für Schnittstellen (da Sie COM-Typen haben können - und möglicherweise auch andere -, die tatsächlich Schnittstellen implementieren, die nicht in der.GetInterfaces
Liste des .NET-Typs definiert sind ).TryCast()
undas
sind nicht genau gleich.TryCast()
Funktioniert nur mit Referenztypen, währendas
alles funktioniert, was null sein kann. Funktioniert alsoint? icast = myNum as int?;
einwandfrei, gibt aberDim icast as Integer? = TryCast(myNum, Integer?)
einen Compilerfehler aus. Nur noch ein merkwürdiger Unterschied zwischen den beiden Sprachen. lolMit
CType
kann man so etwas schreibenCtype("string",Integer)
. Aber mitDirectCast
der obigen Anweisung würde Kompilierungszeitfehler geben.quelle
DirectCast
ist restriktiver alsCType
.Dies löst beispielsweise einen Fehler aus:
Es wird auch in der Visual Studio-IDE angezeigt.
Dies wirft jedoch keinen Fehler aus:
quelle