Преобразования базовых типов данных
Последнее обновление: 30.10.2015
Итак, как вы выше увидели, каждый тип данных характеризуется
определенным количеством байт, которое этот тип занимает в памяти. При
этом для нас вполне логичным
было бы написать что-то вроде:
1 2 | Dim x As Byte = 6
Dim y As Integer = x + 45
|
В то же время эта запись не совсем эквивалентна следующей, хотя результат один и тот же:
1 2 | Dim x As Byte = 6
Dim y As Byte = x + 45
|
Все дело в том, что в первом случае компилятор применяет
преобразование типов: он преобразует данные типа Byte в данные типа
Integer.
Данный тип преобразований называется расширяющим (widening), так как тип
Byte расширяет свой размер до размера типа Integer.
Кроме расширяющих преобразований есть еще и сужающие:
1 2 3 | Dim num1 As Integer = 1
Dim num2 As Integer = 2
Dim res As Byte = num1 + num2
|
В этом случае переменные num1 и num2 типа Integer сужались до типа
Byte. Однако с сужающими преобразованиями, особенно с теми, которые
выполняются
неявно, как в нашем случае, надо обращаться осторожно. Так, следующий
код выбросит исключение OverflowException:
1 2 3 | Dim num1 As Integer = 100
Dim num2 As Integer = 200
Dim res As Byte = num1 + num2
|
Что в принципе не удивительно, так как итоговое число - 300 больше
максимального числа, которое может представлять тип Byte, то есть больше
255.
Другой момент, который надо затронуть, - это явные (explicit conversion) и неявные (implicit conversion) преобразования.
Все выше перечисленные преобразования выполнялись у нас неявно. То есть
компилятор сам выполнял преобразование из типа Integer в тип Byte без
дополнительных команд. Мы можем явно запретить неявные сужающие
преобразования,
установив в самом верху кода программы оператор Option Strict On. Кроме
того, мы можем установить этот оператор применительно ко всему проекту
через свойства проекта (в меню выберите пункт Проект(Project) и в
появившемся меню выберите пункт Свойства (Properties)):
После установки для данного оператора значения On строчка Dim res As Byte = num1 + num2
будет рассматриваться как ошибочная.
В этом случае мы должны будем явно преобразовывать типы с помощью соответствующих методов:
1 2 3 | Dim num1 As Integer = CInt (Console.ReadLine())
Dim num2 As Integer = 2
Dim res As Byte = CByte (num1) + CByte (num2)
|
В данном случае метод CInt
преобразует вводимую строку в число типа Integer, а метод CByte
преобразует число из типа Integer
в тип Byte. В языке VB.NET применяются следующие методы для преобразований типов:
Метод CBool преобразует в тип Boolean любой числовой тип (включая Byte, SByte и типы перечисления), а также String, Object
Метод CByte преобразует в Byte любой числовой тип (включая SByte и типы перечисления), а также Boolean, String, Object
Метод CChar преобразует в Char объекты String, Object
Метод CDate преобразует в Date объекты String, Object
Метод CDbl преобразует в Double любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CDec преобразует в Decimal любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CInt преобразует в Integer любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CLng преобразует в Long любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CObj преобразует в Object любой тип данных
Метод CSByte преобразует в SByte любой числовой тип (включая Byte и типы перечисления), а также Boolean, String, Object
Метод CShort преобразует в Short любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CSng преобразует в Single любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CStr преобразует в String любой
числовой тип (включая Byte, SByte и типы перечисления), а также Boolean,
Char, массив Char, Date, Object
Метод CUInt преобразует в UInteger любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CULng преобразует в ULong любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Метод CUShort преобразует в UShort любой числовой тип (включая Byte, SByte и типы перечисления), а также Boolean, String, Object
Кроме того, для преобразования типов мы можем использовать функцию CType.
Она принимает два параметра: первый параметр представляет переменную,
которую надо преобразовать, а второй параметр - тип данных, в который
надо эту переменную преобразовать. В следующем коде мы приводим
переменную num3 к типу Byte:
1 2 | Dim num2 As Integer = 2
Dim num3 = CType (num2, Byte )
|