В Visual Basic проблема преобразования типов возникала с первых версий языка и становилась особенно актуальной с появлением строгой типизации и множественных иерархий классов в .NET.
Основная задача — обеспечить безопасное и явное преобразование между совместимыми типами данных с учетом времени выполнения и возможности возникновения ошибок.
Решение — в VB.NET предусмотрены ключевые операторы приведения: CType, DirectCast, TryCast.
CType выполняет преобразование между любыми совместимыми типами и может вызывать реализацию интерфейса IConvertible.DirectCast строго требует совместимости типов в иерархии наследования, не выполняет преобразование типов, а только ссылочное приведение.TryCast возвращает Nothing, если привести невозможно, не создавая исключения (подходит только для ссылочных типов).Пример кода:
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 — объект Dog или Nothing
Ключевые особенности:
CType наиболее универсален, но может выбрасывать исключения при невозможности конверсии.DirectCast отслеживает только строгое соответствие типа ссылок.TryCast не создает исключения, а просто возвращает Nothing.Можно ли использовать TryCast для значимых типов (Value Types)?
Нет, TryCast работает только с ссылочными (Reference) типами. При попытке использовать его для структуры будет ошибка компиляции.
Чем отличается CInt(obj) от CType(obj, Integer)?
Они похожи, оба пытаются преобразовать obj в Integer. Однако CInt более строг с определением формата строки, и предпочтительнее использовать CType при наличии явных преобразований.
В каком случае лучше использовать DirectCast, а не CType?
Когда известно, что объекты связаны отношением наследования или реализуют один интерфейс, и не требуется выполнять пользовательское преобразование типа. DirectCast более производителен, так как не вызывает логику преобразования.
В проекте всегда используют CType для любых преобразований, в результате иногда случаются необработанные исключения, когда типы не совместимы.
Плюсы:
Минусы:
Командой используются разные операторы: DirectCast для ссылочных структур, TryCast при работе с неизвестными объектами. Добавлена обработка Nothing для TryCast.
Плюсы:
Минусы: