W Visual Basic problem konwersji typów pojawił się już w pierwszych wersjach języka i stał się szczególnie aktualny wraz z wprowadzeniem ścisłej typizacji oraz wieloma hierarchiami klas w .NET.
Podstawowym zadaniem jest zapewnienie bezpiecznej i jednoznacznej konwersji między zgodnymi typami danych z uwzględnieniem czasu wykonywania i możliwości wystąpienia błędów.
Rozwiązaniem jest to, że w VB.NET przewidziano kluczowe operatory rzutowania: CType, DirectCast, TryCast.
CType wykonuje konwersję między dowolnymi zgodnymi typami i może wywołać implementację interfejsu IConvertible.DirectCast ściśle wymaga zgodności typów w hierarchii dziedziczenia, nie wykonuje konwersji typów, a tylko rzutowanie referencyjne.TryCast zwraca Nothing, jeśli rzutowanie jest niemożliwe, nie generując wyjątku (odpowiada tylko dla typów referencyjnych).Przykład kodu:
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 — obiekt Dog lub Nothing
Kluczowe cechy:
CType jest najbardziej uniwersalny, ale może zgłaszać wyjątki, gdy konwersja jest niemożliwa.DirectCast śledzi tylko ścisłe dopasowanie typów odniesienia.TryCast nie generuje wyjątku, a po prostu zwraca Nothing.Czy można użyć TryCast dla typów wartościowych (Value Types)?
Nie, TryCast działa tylko z typami referencyjnymi (Reference). Próba użycia go dla struktury spowoduje błąd kompilacji.
Czym różni się CInt(obj) od CType(obj, Integer)?
Są podobne, obie próbują przekonwertować obj na Integer. Jednak CInt jest bardziej restrykcyjny w określaniu formatu ciągu i lepiej jest używać CType, gdy istnieją wyraźne konwersje.
W jakim przypadku lepiej użyć DirectCast zamiast CType?
Gdy wiadomo, że obiekty są połączone relacją dziedziczenia lub implementują jeden interfejs i nie jest wymagane wykonywanie użytkowej konwersji typu. DirectCast jest bardziej wydajny, ponieważ nie wywołuje logiki konwersji.
W projekcie zawsze używa się CType do wszelkich konwersji, w wyniku czego czasami występują nieobsłużone wyjątki, gdy typy są niezgodne.
Zalety:
Wady:
Zespół używa różnych operatorów: DirectCast dla struktur referencyjnych, TryCast podczas pracy z nieznanymi obiektami. Dodano obsługę Nothing dla TryCast.
Zalety:
Wady: