В Visual Basic переменные хранят
информацию (значения). При их использовании Visual Basic резервирует область
в памяти компьютера для хранения данной информации. Имена переменных могут
достигать 255 символов в длину, начинаются они с буквы, за которой могут
следовать другие буквы, цифры или символы подчеркивания. Регистр символов
и наименований переменной значения не имеет. Следующая таблица перечисляет
некоторые возможные имена переменных и объясняет, подходят ли они по стандарту.
Base1_Ball | Подходит |
1Base_Ball | Не подходит, так как начинается не с буквы. |
Base.1 | Не подходит, так как используется точка. |
Base&1 | Не подходит, так как используется амперсанд. |
ThisIsLongButOK | Не подходит, так как длина всего 15 символов. |
Visual Basic работает с 14 стандартными типами переменных. Кроме того, программист может определить собственный тип данных. В данном разделе описаны те из них, которые в основном применяются при работе с данными.
String
Строковые переменные хранят
символы. Один из способов обозначить данный тип переменной состоит в добавлении
символа "$" к концу ее имени, например: AStringVariable$. Теоретически
такая переменная может содержать до 2 миллиардов символов. В любом случае
на конкретном компьютере это число будет гораздо меньше из-за ограниченных
объемов оперативной памяти, ресурсов Windows или числа символов, используемых
в форме.
Одно из наиболее основных
применений строковых переменных состоит в выборе информации из полей ввода.
Например, если есть поле ввода с именем Textl, то тогда оператор ContentOfTextlS
= Textl.Text присваивает строку из поля ввода переменной в левой части
данного оператора.
Integer
Целочисленные переменные могут
хранить только относительно небольшие целые числа (в диапазоне от -32768
до +32767). Арифметические операции над такими числами выполняются очень
быстро. Для обозначения такого типа используется символ "%":
AnIntegerVariable% = 3
Long Integer
Данный тип впервые появился
в языке QuickBASIC. В таких переменных хранятся целые значения от -2 147483648
до +2 147483647. Обозначается символом "&". Арифметические операции
над такими числами выполняются тоже очень быстро, и при работе с процессором
386DX или 486DX существует лишь небольшая разница в скорости вычислений
между Long Integer и Integer.
ALongIntegerVariableS = 123456789 Single Precision
Идентификатором для данных чисел является символ "!". Данный тип переменной позволяет хранить дробные числа с точностью до семи цифр. Это означает, что если получается результат 12345678.97, то часть 8.97 не является точной. Результат может быть равен, к примеру, 12345670.01. Длина чисел может достигать 38 знаков. Вычисления с данными переменными тоже будут приблизительными. Более того, арифметические действия выполняются медленнее, чем с целочисленными переменными.
Double Precision
Переменные такого типа позволяют
хранить числа с точностью до 16 цифр и длиной до 300 символов. Идентификатором
является "#". Вычисления с ними тоже являются приблизительными, а скорость
их относительно небольшая. В основном переменные типа Double Precision
используются для научных расчетов.
Currency
Данный тип отсутствовал в
версиях GW-BASIC и QuickBASIC. Он создан для того, чтобы избежать ошибок
при преобразовании десятичных чисел в двоичную форму и наоборот. (Невозможно
1/10 представить как сумму 1/2,1/4, 1/8, 1/16 и т.п.) Данный тип может
иметь до 4 цифр после запятой, и до 14 - перед ней. Внутри данного диапазона
вычисления будут точными. Идентификатор представляет собой символ "@".
Поскольку все арифметические операции, кроме сложения и вычитания, выполняются
так же медленно, как и в случае переменных с двойной точностью, данный
тип является предпочтительным для проведения финансовых расчетов. (Для
тех, кто интересуется: данный тип использует целые числа из 19 разрядов,
которые затем делятся на 10000. Это позволяет организовать 15 знаков до
запятой и 4 после нее.)
Date
Этот тип данных позволяет
хранить значения времени и даты в промежутке от полуночи 1 января 100 года
до полуночи 31 декабря 9999 года. Такие значения в тексте программ обозначаются
символами "#", например:
Millenium = #January 1, 2000#
Если вводится только значение
даты, Visual Basic полагает, что время равняется 00:00.
Byte
Байтовый тип является новым
в Visual Basic 5 и предназначен для хранения целых чисел от 0 до 255. Его
использование позволяет сильно экономить оперативную память и уменьшать
размер массивов (см. главу 10) по сравнению с предыдущими версиями Visual
Basic. Кроме того, он используется при работе с двоичными файлами.
Boolean
Булев тип данных может хранить
только два значения: True либо False. Его использование вместо целочисленных
переменных является хорошим стилем программирования.
Variant
Данный тип добавлен в Visual
Basic 5 из версии 2.0. Переменная типа variant может содержать данные любого
типа. Если Visual Basic не знает тип принимаемых данных, необходимо использовать
variant.
Тип информации не имеет значения, поскольку variant
может содержать любой тип данных (численный, дата/ время, строковый). Visual
Basic автоматически производит необходимые преобразования данных, поэтому
не стоит беспокоиться об этом. С другой стороны, можно использовать встроенные
функции для проверки типа данных, хранящихся в переменной типа variant.
Они позволяют легко проверить, правильно ли пользователь вводит информацию.
Использование такого типа
данных, как variant, замедляет работу программы, так как требуется время
и ресурсы для операций преобразования типов. Кроме того, многие программисты
понимают, что использование автоматических преобразований типов данных
приводит к неаккуратному виду программ. Единственная причина в использовании
variant состоит в возможных ошибках при преобразовании типов непосредственно
программистом.
В отличие от большинства версии
BASIC, в одной программе Visual Basic нельзя использовать имена переменных,
отличающиеся только типом (идентификатором), например, А% и А!. При попытке
использовать двойное имя возникает ошибка "двойное определение" (duplicate
difmition) при запуске программы.
При первом использовании переменной Visual Basic
временно присваивает ей пустое значение и тип variant. Это значение исчезает
в тот момент, когда переменной присваивают реальное. Каждый тип данных
имеет свой образец "пустого" значения. Для строковых переменных это строка
нулевой длины (" "). Для численных переменных это ноль. Полагаться можно
только на значения по умолчанию, если они документированы (например, в
комментариях). Иначе придется столкнуться с множеством трудно уловимых
ошибок. Поэтому рекомендуется инициализировать значения переменных в первых
строках процедур обработки событий.
Пример: обмен значениями
Одной из распространенных
задач является обмен значениями между двумя переменными. Удивительно, но
разработчики Visual Basic убрали из языка оператор Swap, известный в QuickBASIC.
Поэтому код придется писать самим. Предположим, что есть две переменные
х и у, и попробуем поменять местами их значения:
х = у
у = х
Такой вариант работать не будет, но важно разобраться из-за чего. Первый оператор присваивает переменной х значение переменной у, но тем самымуничтожает старое значение х.. В результате второй оператор присваивает переменной у ее же первоначальное значение. Решение состоит в использовании временной переменной:
temp = х 'Копирует старое значение
х в temp
х = у
'Теперь х содержит старое значение у
у = temp 'Теперь у содержит оригинальное
значение х
Объявление переменных: оператор Dim для различных типов данных
Большинство людей предпочитают не пользоваться идентификаторами для обозначения типа переменной (тем более, что для таких типов, как дата/время, вообще не существует идентификаторов). Вместо этого они используют оператор Dim. Такая операция носит название объявления. Объявление типов переменных в процедурах обработки событий перед их использованием - и, естественно, с комментариями - является хорошим стилем в программировании. Это также помогает улучшить читабельность текстов программ.
Private Sub cmdCalculate Click
'Данная процедура вычисляет проценты по закладной
Dim Years As Integer
Dim Rate As Currency
Dim Amount As Currency
Dim I As Integer
Dim TextBox As String
Dim Interest As Currency End Sub
Объявления переменных можно комбинировать в
одной строке, например:
Dim Year As Integer, Rate As Currency, Name As
String
Dim X, Y, Z As Integer
в предположении, что все три переменные будут
целого типа. Фактически в данном случае переменные Х и Y будут объявлены
как variant, и только Z - как integer. Чтобы избежать этого, необходимо
каждый раз использовать идентификатор типа.
Если переменная объявлена при
помощи оператора Dim, в случае использования переменной с тем же именем
и другим идентификатором типа произойдет ошибка "двойное определение" при
запуске программы. Например, если следующее выражение Dim Count As Integer
объявляет переменную Count, то нельзя использовать переменные CountS, Count!,
Count# и Count@. Можно использовать только имя Count%, но это всего лишь
другая форма для имени переменной Count.
И, наконец, чтобы присвоить
переменной тип variant, используют оператор Dim без As:
Dim Foo 'объявляет Foo переменной типа variant
Можно написать и так:
Dim Foo As Variant ' проще для прочтения
Необходимость объявления переменных
Одной из наиболее общих ошибок
в программах является использование необъявленных переменных. Проблема
состоит в том, что Visual Basic позволяет создавать переменные "на лету",
как только они первый раз встречаются в программе. Если перепутать имя
переменной. Visual Basic создаст новую с похожим именем и присвоит ей значение
по умолчанию, что тут же приведет к ошибкам. Эту ошибку трудно обнаружить,
поскольку имена переменных очень похожи.
Простейший способ избежать
подобных ошибок состоит в принудительном объявлении всех переменных. Тогда
при ошибке в имени переменной будет выдано сообщение. Разработчики Visual
Basic предусмотрели такую возможность работы, но по умолчанию она не используется.
Оператор, необходимый для
этого, называется Option Explicit. Это первый из операторов, не используемый
в процедурах обработки событий. Хороший способ запомнить для себя его принцип
работы состоит в использовании Option Explicit для изменения значений по
умолчанию.
Для того чтобы поместить Option
Explicit в раздел (General), необходимо:
(Для копирования примера программы
из справочной системы можно использовать кнопку Copy в окне Code для примера.
Затем можно использовать пункт Paste из меню Edit для вставки примера в
окно Code.). После того как Visual Basic встречает команду Option Explicit,
он более не позволяет использовать необъявленные переменные. Если попробовать
все же применить такую переменную, будет выдано сообщение об ошибке, как
показано ниже.
Изменение значений по умолчанию для типов
Следующее выражение автоматически присваивает переменным I, J и К тип variant:
Dim I, J, К
Предположим, в новой программе
почти все переменные должны быть целочисленными. В таком случае удобно
организовать их объявление так, чтобы переменная, для которой не указан
тип, больше не объявлялась как variant. Для этого используется оператор
DefType. В следующей таблице приведено несколько примеров его использования:
|
|
|
Все переменные получают тип integer. |
|
Все переменные, начинающиеся с букв I и J, получают тип integer. |
|
Все переменные, начинающиеся с букв от S до Z, получают тип String |
Deflnt
диапазон букв (для integer)
DefLng диапазон
букв (для long integer)
DefSng диапазон
букв (для single precision)
DefDbl диапазон
букв (для double precision)
DefCur диапазон
букв (для currency)
DefStr
диапазон букв (для string)
DefVar диапазон
букв (для variant)
DefBooi диапазон
букв (для boolean)
DefByte диапазон
букв (для byte)
DefDate диапазон букв
(для date)
Буквы не обязательно должны быть заглавными: DefStr s-Z и DefStr S-Z работают одинаково. Соглашения о типах можно всегда изменить, используя идентификатор или оператор Dim для конкретной переменной. Оператор DefType размещают в том же разделе (General), что и Option Explicit.
Программисты применяют термин
область видимости, когда хотят сказать о возможности использования переменной
из одной части программы в другой ее части. В старых языках программирования
все переменные были доступны во всех частях программы, поэтому сохранение
целостности наименований представляло большую проблему. Например, если
в приложении использовались две переменные Total, то их значения уничтожали
друг друга.
Решение данной проблемы в
современных языках высокого уровня, таких как Visual Basic, состоит в изолировании
переменных внутри процедур. До тех пор пока это не задано специальным образом,
значение переменной Total в одной процедуре никак не влияет на значение
переменной с таким же именем в другой процедуре. В терминах программирования
данный подход означает, что данные переменные являются локальными по отношению
к процедурам, если не указано иначе. В частности, процедура обработки
события обычно не имеет никакой связи с другой процедурой того же типа.
Обычно не принято работать с переменными по умолчанию. Если необходимо
быть уверенным, что данная переменная является локальной, нужно объявить
ее внутри процедуры события при помощи оператора Dim.