ПОНЯТНО О Visual Basic NET

Преобразование типов


Трудности. Итак, мы видим, что когда дело касается типов, VB проявляет некоторую придирчивость. Например, как мы только что видели, он не разрешает литералам без специальных символов иметь любой тип. Или требует, чтобы результат сложения, вычитания или умножения чисел определенного целочисленного типа умещался в этот же тип. Например, после запуска процедуры

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a As Byte = 200

        Dim b As Byte = 100

        Debug.WriteLine(a - b)

        Debug.WriteLine(a + b)

    End Sub

будет выдана ошибка переполнения, так как 200+100 больше 255 – предельного значения для типа Byte.

Вы столкнетесь также с придирчивыми функциями, требующими себе аргументов определенного типа и жалующимися, если они имеют другой тип.

Во всех этих случаях перед вами встанет вопрос: уступать требованиям VB или не уступать. Казалось бы: чего проще! – уступи и дело с концом. Например, я советовал для предотвращения переполнения объявлять все переменные, участвующие в вычислениях, самым вместительным типом из тех, что могут понадобиться для результатов вычислений. И это хороший совет.

Еще один совет: если ничего не помогает, откажитесь от объявления типа у переменных, являющихся причиной придирок, смирившись с отрицательными последствиями неопределенности типа. То есть просто пишите   Dim a.

И с придирчивой функцией тоже нетрудно согласиться и объявить переменную так, как она требует.

Но не всегда эти уступки бывают программисту удобны. Мы еще столкнемся с конкретными случаями такого неудобства. И поэтому сейчас я покажу вам, как сделать так, чтобы и волки были сыты, и овцы целы.



Функции преобразования типов. Существуют специальные функции, назначение которых – преобразовывать свой аргумент к определенному типу. Например, функция CInt преобразовывает свой аргумент к типу Integer. Поэтому оператор

        Debug.WriteLine(CInt(2.4 + 10))

напечатает  12, а не 12,4.


Пусть в предыдущем примере про 200+ 100 мы не хотим менять тип переменных Byte на более вместительный Short. Как же тогда избавиться от переполнения? Применить CShort – функцию преобразования своего аргумента в тип Short. Вот так:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a As Byte = 200

        Dim b As Byte = 100

        Debug.WriteLine(a - b)

        Debug.WriteLine(CShort(a) + CShort(b))

    End Sub

Здесь функция CShort преобразует перед сложением значения переменных a и b из типа Byte в тип Short. Не переменные, а их значения, и не везде, а только в данном месте. Сами переменные как были, так и остались типа Byte, и их значения в других местах программы (там, где вычитание) тоже остались типа Byte.

Преобразование состоялось и сложение поэтому выполнялось над числами типа Short и результат (300) обязан был умещаться именно в этот тип, куда он свободно и уместился.

Вот таблица функций преобразования типов, куда я для справки включил и функции преобразования в нечисловые типы:

Функция

Преобразует в тип

CByte

Byte

CShort

Short

CInt

Integer

CLng

Long

CSng

Single

CDbl

Double

CDec

Decimal

CChar 

Char

CStr

String

CBool

Boolean

CDate

Date

CObj 

Object

Неявное преобразование типов. При выполнении арифметических действий (и в других случаях) VB часто незаметно для нас и сам преобразовывает числа из одного типа в другой. Например, вычисляя выражение   5+2.8,   VB преобразует число 5 из типа Integer в тип Double, после чего складывает числа и получает результат 7.8 типа Double.

Вообще,

выполняя арифметические действия над числами разных типов, VB преобразует их к единому типу, который вмещал бы типы обоих чисел, после чего присматривает, чтобы результат тоже умещался в этом типе.

Вот список числовых типов в порядке возрастания вместительности:

Byte, Short, Integer, Long, Single, Double, Decimal



Пример: при выполнении фрагмента

        Dim a As Short = 32700

        Dim b As Byte = 100

        Debug.WriteLine(a + b)

VB преобразует число 100 в тип Short, а затем выдаст переполнение, так как результат сложения не умещается в тип Short.

При делении целочисленных типов VB преобразует делимое и делитель в основном к типу Double и результат получается тоже типа Double.

Например, при делении 2 на 3  VB видит, что результат не получится целым, поэтому он сначала преобразует оба целых числа в тип Double и результат получает того же типа.

Существуют определенные правила неявного преобразования типов, в которые мы не будем подробно вдаваться.

Тип арифметического выражения. Пусть VB вычисляет выражение a+b*c. Спрашивается, какой тип будет у вычисленного выражения? Рассуждаем по цепочке. Сначала VB выполняет умножение b*c и тип произведения определяет по только что приведенному правилу. Затем, имея уже произведение и зная его тип, VB прибавляет его к a,  определяя тип суммы опять по тому же правилу.

Так, по цепочке выполняемых действий, VB определяет тип любого самого длинного выражения.


Содержание раздела