Переменные и присваивание
Имена переменных в VB .NET имеют длину до 255 символов и обычно начинаются с буквы в кодировке Unicode (за дополнительной информацией о Unicode обращайтесь на сайт www.unicode.org), хотя также допускается символ подчеркивания. Далее следует произвольная комбинация букв, цифр и символов подчеркивания. Все символы имени являются значимыми, но регистр символов игнорируется (как вообще в VB .NET); считается, что firstBase и firstbase — одна и та же переменная. Присваивание выполняется при помощи знака =, как и в более ранних версиях VB:
theYear
= 2001
В .NET Framework
используются новые правила
присваивания имен переменным,
заметно изменившиеся по сравнению
с VB6. В соответствии рекомендациями,
приведенными в MSDN, применять
венгерскую запись нежелательно, а
значимые имена переменных (то есть
не состоящие из одной буквы, как i
или t) должны оформляться в
альтернативной схеме выбора
регистра. В прежних версиях VB
обычно использовалась схема Pascal.
Имена переменных не могут совпадать с последовательностями, зарезервированными VB .NET (список для текущей версии приведен в табл. 3.1), однако это ограничение можно обойти, заключив имя переменной в квадратные скобки. Например, переменная не может называться Loop, а имя [Loop] подойдет — хотя делать это не рекомендуется. Зарезервированные слова внутри имен переменных допустимы (скажем, loopit — вполне нормальное имя). При попытке использования ключевого слова в качестве имени переменной VB .NET подчеркивает его и информирует об ошибке (при помощи экранной подсказки).
Таблица 3.1. Ключевые
слова текущей версии VB .NET
AddHandler |
AddressOf |
Alias |
And |
Ansi |
As |
Assembly |
Auto |
Binary |
BitAnd |
BitNot |
BitOr |
BitXor |
Boolean |
ByRef |
Byte |
ByVal |
Call |
Case |
Catch |
CBool |
CByte |
CChar |
CDate |
CDec |
CDbl |
Char |
CInt |
Class |
CLng |
CObj |
Compare |
Const |
CShort |
CSng |
CStr |
Ctype |
Date |
Decimal |
Declare |
Default |
Delegate |
Dim |
Do |
Double |
Each |
Else |
Elself |
End |
Enum |
Erase |
Error |
Event |
Exit |
Explicit |
ExternalSource |
False |
Finally |
For |
Friend |
Function |
Get |
GetType |
GoTo |
Handles |
If |
Implements |
Imports |
In |
Inherits |
Integer |
Interface |
Is |
Lib |
Like |
Long |
Loop |
Me |
Mod |
Module |
Mustlnherit |
MustOverride |
MyBase |
MyClass |
Namespace |
Next |
New |
Not |
Nothing |
Notlnheritable |
NotOverridable |
Object |
Off |
On |
Option |
Optional |
Or |
Overloads |
Overridable |
Overides |
Pa ram Array |
Preserve |
Private |
Property |
Protected |
Public |
RaiseEvent |
Readonly |
Re Dim |
REM |
RemoveHandler |
Resume |
Return |
Select |
Set |
Shadows |
Shared |
Short |
Single |
Static |
Step |
Stop |
Strict |
String |
Structure |
Sub |
SyncLock |
Text |
Then |
Throw |
To |
True |
Try |
TypeOf |
Unicode |
Until |
When |
While |
With |
With Events |
WriteOnly |
Xor |
Литералы и их соответствие типам данных
Литералом называется
последовательность символов,
которая может интерпретироваться
как значение одного из примитивных
типов. Но с типами (даже
примитивными) в VB .NET дело обстоит
несколько сложнее, чем в более
ранних версиях VB.
Хотя
возможность непосредственной
интерпретации данных
предусмотрена в любом языке
программирования, решить, как
именно следует интерпретировать те
или иные данные, иногда бывает
непросто. Наверное, все согласятся
с тем, что 3 — это число 3 и его
следует интерпретировать именно
так. Но что такое число 3 с точки
зрения компилятора? Сколько байт
памяти следует под него выделить?
Теоретически для хранения числа 3
хватит 2 бит, но в современных
языках программирования обычно
происходит не так.
Итак,
компилятор должен
проанализировать литерал и принять
необходимые решения, поэтому вы
должны по возможности точнее
описать, что вы имеете в виду, не
полагаясь на разумность
компилятора. Вернемся к примеру с
простым числом 3. В VB .NET оно может
представлять собой (среди прочего):
К счастью,
символ 3 никогда не будет
автоматически интерпретироваться
как строковая константа (если не
переопределять стандартную логику
VB). В VB .NET строки и числа по
умолчанию не смешиваются — более
подробно эта тема рассматривается
в разделе «Преобразования
разнотипных значений» этой главы.
С точки зрения
компилятора простой констатации «это
число 3» недостаточно. Разумеется, VB
.NET, как и любой язык
программирования, позволяет
уточнить смысл литерала. Например,
31 — литерал типа Integer со значением 3,
а литерал "3" относится к
строковому типу String (тип String
рассматривается ниже в этой главе;
он несколько отличается от
строкового типа в прежних версиях VB).
Примитивные
типы можно рассматривать как
атомарные элементы языка, хотя в VB .NET
они представляют собой псевдонимы
для классов из библиотеки System.
В переменной,
объявленной с примитивным типом,
хранятся значения указанного типа.
Ниже перечислены примитивные
числовые типы VB .NET.
Если
суффикс не указан, а число входит в
интервал допустимых значений типа
Integer, по умолчанию оно сохраняется в
формате Integer. Это связано с тем, что
на 32-разрядных процессорах тип Integer
обрабатывается эффективнее
остальных типов.
При
объявлении числовых переменных
можно использовать старые суффиксы
типов %, & и т. д. — например,
литерал 1234% относится к типу Long. Но
при этом следует помнить, что в VB6 и
VB .NET эти суффиксы имеют разный
смысл, поскольку тип Integer VB .NET
соответствует типу Long V86. По этой
причине использовать старый
синтаксис не рекомендуется.
Любой
целочисленный литерал можно
записать в шестнадцатеричной
системе счисления (по основанию 16),
для чего он снабжается префиксом
&Н. Например, литерал &HF
соответствует десятичному числу 15,
хранящемуся в формате Integer,
поскольку суффикс типа не указан, а
число входит в интервал допустимых
значений типа Integer. Числа,
записанные в восьмеричной системе
счисления (по основанию 8),
снабжаются префиксом &0.
При выполнении
операций с вещественными числами
используются следующие типы:
Новый тип Decimal
пришел на смену старому типу Currency,
использовавшемуся в прежних
версиях VB. Он используется в
ситуациях, когда ошибки округления
недопустимы.
Применение
суффикса типа в литералах помогает
избежать путаницы и случайных
ошибок переполнения, возникающих
при умножении двух чисел. При
выполнении следующей команды:
Console.WriteLine(12345678
* 4567)
компилятор
выдает ошибку:
This constant expression produces a value that is not representable in type System.Integer.
Проблема решается при помощи суффикса типа Long:
Console.WriteLine(123456781
* 4567)
Общие методы
MaxValue и MinValue, ассоциированные с
типом, возвращают соответственно
верхнюю и нижнюю границы интервала
допустимых значений. Пример:
Console.WriteLine(Integer.MaxValue)
В табл. 3.2
собраны данные о соответствии
числовых типов VB .NET, типов .NET Framework и
их аналогов из VB6 (если они есть).
Таблица 3.2. Соответствие
между числовыми типами
Тип VB. NET |
Тип .NET
Framework |
Тип VB6 |
Byte |
System. Byte |
Byte |
Boolean |
System. Boolean |
Boolean |
Decimal |
System. Decimal |
— |
— |
— |
Currency |
Double |
System. Double |
Double |
Short |
System. Intl6 |
Integer |
Integer |
System.Int32 |
Long |
Long |
System.Int64 |
— |
Single |
System. Single |
Single |
Кроме числовых
литералов также существуют
литералы типов Boolean, Date и Char. Тип
данных Bool ean принимает значения True и
Fal se. В VB .NET он представляется 4
байтами (в отличие от 2 байт в VB6).
В VB .NET бета-версии
1 значение True было равно +1 (как и в
других языках .NET). Начиная с бета-версии
2 оно снова стало равно -1. Говоря
точнее, в поразрядных операциях и
при преобразовании к числовым
типам значение True равно -1, а не 1. Но
если логическая величина VB .NET
передается за пределы VB, при
приведении к числовому типу нового
языка она считается равной 1.
Пожалуй, это решение было ошибочным,
поскольку одной из целей,
поставленных при разработке .NET,
было обеспечение максимальной
межъязыковой совместимости. Пока
вы ограничиваетесь встроенными
константами True и False, все будет
нормально, но стоит перейти к
конкретным числовым значениям — и
у вас могут возникнуть проблемы.
Тип данных Date
представляет дату и/или время. Как
ИГ в VB5, такие литералы заключаются
между символами #...# — например, #Jan 1.
2001#. Если время не указано),
предполагается, что литерал
соответствует полуночи указанной
даты.
Тип Date в VB .NET
не преобразуется к типу Double. В
частности, из этого следует, что с
датами нельзя производить
математические вычисления —
например, вычислить завтрашнюю
дату командой Today+1.
Тип данных Char
представляет один символ Unicode.
Объем кодировки Unicode (65 536 символов)
вполне достаточен для
представления всех существующих
алфавитов. Обычно символ
заключается в кавычки, за которыми
следует префикс С (например, "Н"С),
но вы также можете воспользоваться
встроенной функцией Chr и указать
числовой код символа Unicode. Например,
запись Chr(&H2153) представляет
символ 1/3 кодировке Unicode, хотя в
некоторых операционных системах
этот символ не будет отображаться
во время работы программы. Если
заключить один символ в кавычки без
суффикса «С», вы получите тип Stri ng
вместо Char, а автоматическое
преобразование между этими типами
не поддерживается (команда Opti on Strict
описана ниже в этой главе).