Typumwandlung in Visual Basic .NET

Bereitgestellt von Molly Pell, Senior Systems Analyst

Visual Basic .NET bietet zwei Optionen für die Umwandlung.

  • CType: Konvertiert einen Typ in einen anderen Typ. Wenn die Typen nicht übereinstimmen, kann Zwang ausgeführt werden.
  • DirectCast: Konvertiert einen Typ in einen anderen Typ mit besserer Leistung als CType , führt jedoch keinen Zwang aus, wenn die Typen nicht übereinstimmen.

Hinweis: CType enthält alle VB-Konvertierungsfunktionen. Dies sind CBool, CByte, CChar, CDate, CDec, CDbl, CInt, CLng, CObj, CShort, CSng und CStr.

Der Hauptunterschied zwischen den beiden besteht darin, dass DirectCast nur funktioniert, wenn der angegebene Typ und der Laufzeittyp des Ausdrucks identisch sind. Dieser Unterschied tritt nur beim Konvertieren von einem Objekttyp in einen Werttyp oder beim Auspacken eines Werts auf.

Der folgende DirectCast-Vorgang schlägt beispielsweise fehl, da der Boxed-Typ des Objekts O keine Ganzzahl ist:

Dim O As Object = 1.5

Dim I As Integer = DirectCast(O, Integer) ‚ Verursacht einen Laufzeitfehler.

Dim I As Integer = CType(O, Integer) ‚ Verursacht keinen Laufzeitfehler.

Die DirectCast-Operation in diesem Beispiel ist dagegen erfolgreich:

Dim O As Object = 1

Dim I As Integer = DirectCast(O, Integer) ‚ Ist erfolgreich.

‚ I As Integer = CType(O, Integer) ‚ Ist erfolgreich, aber langsamer als DirectCast

Beim Konvertieren von einem Objekt in einen Werttyp oder beim Unboxing hat der DirectCast-Operator eine bessere Leistung als der CType-Operator. Das Visual Basic .NET Compiler generiert vier Zeilen IL-Code für DirectCast. Die Verwendung von CType bewirkt jedoch, dass der Visual Basic .NET-Compiler einen Aufruf einer Konvertierungsmethode generiert, die weit über hundert Zeilen IL-Code enthält. Diese Methode ruft wiederum andere Methoden auf. Bei leistungskritischem Code kann der Unterschied erheblich sein. Wenn Zwang erforderlich ist, müssen Sie jedoch weiterhin den CType-Vorgang verwenden oder den Zwang manuell ausführen.

Zum Beispiel:

Dim O Als Objekt = 1.5

Dim f As Single = DirectCast(O, Single) ‚ Umwandlung in den Laufzeittyp

Dim i As Integer = CType(f, Integer) ‚ CType ist hier in Ordnung, da dieser
‚ cast doesn ‚t unbox ‚f‘

Fazit

Wenn Sie einen Typ von einem Objekttyp in einen Werttyp umwandeln oder Unboxing durchführen, sollten Sie zuerst feststellen, ob ein Typzwang erforderlich ist. Wenn kein Zwang erforderlich ist (d. h. der Boxed-Typ des Werts entspricht dem im cast-Ausdruck angegebenen Typ), verwenden Sie den DirectCast-Ausdruck, um die Anwendungsleistung zu erhöhen.

Dieser Tipp und mehr ist für Sie mit Total .NET Analyzer! Weitere Informationen finden Sie unter FMS .NET Analyzer.