In Visual Basic gab es seit den ersten Versionen des Sprach eine Problematik bei der Typumwandlung, die mit der Einführung der strengen Typisierung und der vielen Klassenhierarchien in .NET besonders relevant wurde.
Das Hauptziel ist es, eine sichere und explizite Umwandlung zwischen kompatiblen Datentypen unter Berücksichtigung der Laufzeit und der Möglichkeit von Fehlern zu gewährleisten.
Die Lösung – in VB.NET sind die Schlüsseloperatoren für die Umwandlung vorgesehen: CType, DirectCast, TryCast.
CType führt eine Umwandlung zwischen beliebigen kompatiblen Typen durch und kann die Implementierung des Interfaces IConvertible aufrufen.DirectCast erfordert strikt die Kompatibilität der Typen in der Vererbungshierarchie, führt keine Typumwandlung durch, sondern nur eine Referenzumwandlung.TryCast gibt Nothing zurück, wenn die Umwandlung nicht möglich ist, ohne eine Ausnahme zu erzeugen (nur für Referenztypen geeignet).Code-Beispiel:
Class Animal : End Class Class Dog Inherits Animal End Class Dim a As Animal = New Dog() Dim d1 As Dog = CType(a, Dog) Dim d2 As Dog = DirectCast(a, Dog) Dim d3 As Dog = TryCast(a, Dog) ' d3 ist ein Dog-Objekt oder Nothing
Wesentliche Merkmale:
CType ist am vielseitigsten, kann jedoch Ausnahmen bei unmöglicher Umwandlung auslösen.DirectCast überwacht nur die strikte Übereinstimmung der Typen.TryCast erzeugt keine Ausnahmen, sondern gibt einfach Nothing zurück.Kann man TryCast für Werttypen (Value Types) verwenden?
Nein, TryCast funktioniert nur mit Referenztypen. Bei dem Versuch, es für eine Struktur zu verwenden, wird ein Kompilierungsfehler ausgelöst.
Was ist der Unterschied zwischen CInt(obj) und CType(obj, Integer)?
Sie sind ähnlich, beide versuchen, obj in Integer umzuwandeln. Allerdings ist CInt strenger bei der Formatdefinition von Strings und es ist vorzuziehen, CType bei expliziten Umwandlungen zu verwenden.
Wann ist es besser, DirectCast anstelle von CType zu verwenden?
Wenn bekannt ist, dass die Objekte in einer Vererbungsbeziehung stehen oder ein Interface implementieren und keine benutzerdefinierte Typumwandlung erforderlich ist. DirectCast ist leistungsfähiger, da es keine Umwandlungslogik aufruft.
Im Projekt wird immer CType für jede Umwandlung verwendet, was gelegentlich zu unbehandelten Ausnahmen führt, wenn die Typen nicht kompatibel sind.
Vorteile:
Nachteile:
Das Team verwendet unterschiedliche Operatoren: DirectCast für Referenzstrukturen, TryCast bei der Arbeit mit unbekannten Objekten. Eine Behandlung von Nothing für TryCast wurde hinzugefügt.
Vorteile:
Nachteile: