Перейти к основному содержимому

Типы данных в visual-basic

Разработчику Архитектору

Дальше: Справочник Visual Basic · Операции List(Of T)Работа с коллекциями


Типы данных в visual-basic

Как читать эту статью

Сначала принципы типизации и Option Strict, затем интерактивы и таблицы примитивов. Логично после архитектуры; углубление value/reference — Значимые и ссылочные типы, преобразования.


Типы данных в Visual Basic

VB.NET держит строгую типизацию в прикладном коде: Decimal для денег, List(Of T) вместо Object — меньше ошибок на этапе компиляции.

visual-basic, особенно в своей современной реализации как VB.NET, предоставляет разработчику строгую и продуманную систему типов данных. Эта система обеспечивает точность операций, предсказуемость поведения программ и эффективное использование ресурсов. Каждый элемент данных в программе имеет определённый тип, который задаёт диапазон допустимых значений, способ хранения в памяти и набор операций, применимых к этому элементу. Понимание типов данных — основа для написания надёжного, читаемого и производительного кода.


Общие принципы типизации в visual-basic

Play ITЗагрузка интерактивного демо…

В языке visual-basic действует модель строгой статической типизации. Это означает, что переменная должна быть объявлена с указанием её типа до первого использования, и этот тип не может измениться в процессе выполнения программы. Компилятор проверяет соответствие типов на этапе компиляции, что позволяет выявлять множество ошибок ещё до запуска приложения. Такой подход повышает устойчивость программ к неожиданным состояниям и упрощает поддержку кода.

Типизация в VB.NET основана на общей системе типов платформы .NET (Common Type System, CTS). Все типы данных в visual-basic являются производными от базового класса Object, что обеспечивает единообразие и совместимость между различными языками, работающими на платформе .NET. Эта архитектура позволяет использовать одни и те же библиотеки независимо от того, на каком языке они были написаны.

Play ITЗагрузка интерактивного демо…


Основные встроенные типы данных

visual-basic предлагает набор фундаментальных типов данных, каждый из которых предназначен для работы с определённым видом информации. Эти типы делятся на две большие категории: простые (или примитивные) и ссылочные. Простые типы хранят своё значение непосредственно в памяти, тогда как ссылочные типы содержат адрес объекта, расположенного в управляемой куче.


Integer — целочисленный тип

Тип Integer используется для представления целых чисел без дробной части. Он занимает 32 бита (4 байта) памяти и может хранить значения в диапазоне от -2 147 483 648 до 2 147 483 647. Этот тип является наиболее часто используемым для счётчиков циклов, индексов массивов, идентификаторов и других ситуаций, где требуется работа с целыми числами среднего диапазона.

Для случаев, требующих большего или меньшего диапазона значений, visual-basic предоставляет дополнительные целочисленные типы — Byte (0–255), Short (-32 768–32 767), Long (-9 223 372 036 854 775 808–9 223 372 036 854 775 807) и беззнаковые аналоги (UInteger, UShort, ULong). Выбор конкретного типа зависит от требований к диапазону значений и потреблению памяти.


String — строковый тип

Тип String предназначен для хранения последовательностей символов, то есть текстовых данных. В visual-basic строки неизменяемы — любая операция, которая кажется модификацией строки (например, конкатенация), на самом деле создаёт новый объект строки, оставляя исходный без изменений. Это свойство гарантирует безопасность многопоточного доступа и упрощает управление памятью.

Строки в VB.NET используют кодировку Unicode (UTF-16), что позволяет корректно представлять символы практически всех письменных языков мира. Длина строки ограничена только доступной памятью, но каждая строка может содержать до 2 миллиардов символов. Строковый тип поддерживает богатый набор методов для анализа, преобразования и форматирования текста, таких как Substring, IndexOf, Replace, ToUpper, ToLower и многие другие.


Double — тип с плавающей запятой двойной точности

Тип Double применяется для хранения чисел с дробной частью, когда требуется высокая точность и широкий диапазон значений. Он соответствует стандарту IEEE 754 для чисел двойной точности и занимает 64 бита памяти. Диапазон значений составляет примерно от ±5.0 × 10⁻³²⁴ до ±1.7 × 10³⁰⁸, с точностью до 15–16 десятичных цифр.

Этот тип подходит для научных расчётов, финансовых приложений с высокой точностью и любых задач, где важны детали дробной части. Для менее требовательных сценариев существует тип Single (32 бита), обеспечивающий меньшую точность, но экономящий память. При работе с денежными суммами рекомендуется использовать специализированный тип Decimal, который обеспечивает точное десятичное представление и минимизирует ошибки округления.


Boolean — логический тип

Тип Boolean представляет логические значения и может принимать только два состояния: True и False. Он занимает 16 бит памяти в .NET (хотя логически достаточно одного бита), что связано с особенностями выравнивания данных в памяти. Логический тип играет ключевую роль в условных выражениях, циклах и логических операциях.

В visual-basic логические операции выполняются с помощью операторов And, Or, Not, Xor, а также их краткозамкнутых версий AndAlso и OrElse. Краткозамкнутые операторы позволяют избежать ненужных вычислений: если результат выражения уже определён по первой части, вторая часть не вычисляется. Это особенно полезно при проверке условий, связанных с потенциально опасными операциями, такими как обращение к объекту, который может быть Nothing.


VB6 и VBA — типы, которых нет в VB.NET "один в один"

При сопровождении макросов и старых EXE полезно помнить отличия классического Visual Basic (по справочнику типов VB6):

Тип / правилоVB6 / VBAVB.NET
Неявные переменныебез Option Explicit создаётся VariantOption Explicit On — норма
Универсальный контейнерVariant (16–22+ байт, медленный)Object (+ boxing)
BooleanTrue часто как −1 в целочисленном контекстестрого True/False
Объектыприсваивание через Setссылочные типы — обычное =
ДеньгиCurrency (@) — десятичная арифметикаDecimal
Суффиксы типов% Integer, & Long, ! Single, # Double, $ Stringне используются
Decimalтолько как подтип Variant (CDec)встроенный тип

Объявление в VB6: Dim x As Integer или Dim v без типа → Variant. В VBA то же правило; отсюда типичные ошибки при копировании фрагментов в VB.NET без As и без Option Strict.


Date — тип даты и времени

Тип Date служит для хранения информации о дате и времени. Он основан на структуре DateTime платформы .NET и представляет момент времени как количество тактов (100-наносекундных интервалов), прошедших с полуночи 1 января года 1 нашей эры по григорианскому календарю. Диапазон значений простирается от 1 января 0001 года до 31 декабря 9999 года.

Тип Date поддерживает арифметические операции, такие как сложение и вычитание временных интервалов, а также сравнение дат. Он предоставляет множество свойств и методов для получения отдельных компонентов даты (год, месяц, день, час, минута и т.д.), форматирования вывода и выполнения локализованных преобразований. Для более сложных сценариев, связанных с часовыми поясами и календарными системами, рекомендуется использовать типы DateTimeOffset или TimeZoneInfo.

Интерактивная схема ниже — на C# (та же BCL .NET). В VB.NET — Dictionary(Of Integer, String), List(Of String).

Play ITЗагрузка интерактивного демо…


Object — универсальный ссылочный тип

Тип Object является корневым типом всей системы типов .NET. Любое значение или ссылка в программе может быть приведена к типу Object. Это делает его универсальным контейнером, способным хранить данные любого другого типа. Однако использование Object влечёт за собой определённые издержки: потеря статической типизации, необходимость явного приведения типов и снижение производительности из-за операций упаковки и распаковки (boxing/unboxing).

В ранних версиях visual-basic (VB6 и ранее) переменные по умолчанию имели тип Variant, который во многом напоминал Object. В VB.NET такой подход считается устаревшим, и рекомендуется всегда указывать конкретный тип переменной. Тем не менее, тип Object остаётся полезным в ситуациях, требующих максимальной гибкости, например, при работе с коллекциями общего назначения или при взаимодействии с динамическими API.


Строгая типизация и её преимущества в VB.NET

visual-basic .NET реализует модель строгой типизации, которая требует явного указания типа каждой переменной или использования вывода типа на основе инициализирующего выражения. Эта модель обеспечивает высокий уровень безопасности кода, поскольку компилятор может проверить корректность всех операций ещё до запуска программы. Ошибки, связанные с несовместимостью типов — например, попытка сложить строку с датой или присвоить число логической переменной — выявляются на этапе компиляции, а не во время выполнения.

Строгая типизация также улучшает читаемость кода. Когда тип переменной объявлен явно, любой разработчик, читающий программу, сразу понимает, какие значения она может содержать и какие операции над ней допустимы. Это особенно важно в крупных проектах, где код поддерживается командой, а не одним человеком. Кроме того, среда разработки предоставляет более точную подсказку по коду (IntelliSense), что ускоряет написание и снижает вероятность опечаток.


Директивы Option (VB.NET)

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

ДирективаРекомендацияЭффект
Option Explicit Onвсегда Onпеременные нужно объявлять через Dim
Option Strict OnOn в новых проектахзапрет неявных сужающих преобразований и late binding без Object
Option Infer OnOn с Strictвывод типа в Dim x = 42Integer

В типовых шаблонах Visual Studio Option Strict часто выключен — для учебного и промышленного кода его включают осознанно. Пример ошибки при Option Strict On:

Dim count As Integer = 3.7 ' ошибка компиляции: нет неявного преобразования Double → Integer
Dim fixed As Integer = CInt(3.7) ' корректно

Nothing в VB.NET — аналог "нет ссылочного объекта" (для ссылочных типов и nullable). Это не пустая строка "" и не ноль; сравнение с DBNull актуально при чтении полей БД с NULL.


Nullable-типы — работа с отсутствующими значениями

Одной из важных возможностей современного visual-basic является поддержка nullable-типов. Обычные простые типы, такие как Integer, Boolean или Date, не могут содержать значение "ничего" — они всегда должны иметь конкретное значение из своего диапазона. Однако в реальных приложениях часто возникает необходимость представлять отсутствие данных — например, неизвестный возраст пользователя, неустановленная дата окончания задачи или неопределённый статус операции.

Для решения этой задачи в VB.NET введены nullable-типы. Они обозначаются добавлением вопросительного знака к имени типа — Integer?, Boolean?, Date?. На самом деле это сокращённая запись для обобщённого типа Nullable(Of T), где T — базовый тип. Например, Integer? эквивалентен Nullable(Of Integer).

Nullable-тип может принимать все значения своего базового типа, а также специальное значение Nothing, которое означает отсутствие данных. Это позволяет точно моделировать ситуации, где значение может быть неизвестно или не применимо. При работе с nullable-типами доступны свойства HasValue (указывает, содержит ли переменная реальное значение) и Value (возвращает само значение, если оно есть). Также поддерживаются операции сравнения и арифметические действия с автоматическим распространением Nothing: если один из операндов равен Nothing, результат операции также будет Nothing.

Использование nullable-типов особенно актуально при взаимодействии с базами данных, где поля часто допускают значение NULL. Без nullable-типов пришлось бы использовать обходные пути, такие как специальные флаговые значения (-1 для возраста, "01.01.0001" для даты), что усложняло логику и повышало риск ошибок.


Массивы и коллекции

' Массив фиксированной длины
Dim scores(4) As Integer ' индексы 0…4

' Динамический список
Dim names As New List(Of String)
names.Add("Anna")

' Изменение размера массива (VB6-стиль в .NET — редко нужен)
ReDim Preserve scores(9)

Для обхода используйте For Each (см. управляющие конструкции). Подробнее о value/reference и CType/TryCast: глава 9; практика коллекций и файлов — глава 10.


Обобщения (Generics) — параметризованные типы

Линейные структуры в VB.NET — List(Of T), Queue(Of T), Stack(Of T).

Play ITЗагрузка интерактивного демо…

Обобщения — это мощный механизм, позволяющий создавать классы, интерфейсы и методы, которые работают с любым типом данных, не теряя при этом преимуществ строгой типизации. В visual-basic обобщения обозначаются с помощью угловых скобок — List(Of String), Dictionary(Of Integer, Date), Stack(Of Boolean).

Основное преимущество обобщений — безопасность и производительность. Коллекция, такая как List(Of String), гарантирует, что в неё можно добавить только строки, и при извлечении элемента он сразу имеет тип String, без необходимости приведения. Это исключает ошибки времени выполнения, связанные с неправильным типом, и устраняет накладные расходы на упаковку/распаковку, характерные для коллекций на основе Object.

Обобщения широко используются в стандартной библиотеке .NET. Например, вместо устаревшего ArrayList (который хранит Object) рекомендуется использовать List(Of T). Аналогично, вместо Hashtable применяется Dictionary(Of TKey, TValue). Эти обобщённые коллекции обеспечивают высокую производительность, чёткую семантику и удобство использования.

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


Пользовательские типы данных

Помимо встроенных типов, visual-basic позволяет создавать собственные типы данных, адаптированные под конкретные задачи приложения. Основные способы определения пользовательских типов — это структуры (Structure) и классы (Class).

Структуры — это простые типы, аналогичные встроенным (Integer, Date и т.д.). Они хранятся в стеке (или в составе другого объекта) и передаются по значению. Структуры подходят для небольших наборов связанных данных, таких как координаты точки, цвет в RGB-формате или денежная сумма с валютой.

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

Кроме того, visual-basic поддерживает перечисления (Enum) — именованные целочисленные константы, которые делают код более читаемым. Например, вместо магических чисел 0, 1, 2 для обозначения статуса задачи можно определить перечисление TaskStatus со значениями Pending, InProgress, Completed.


Практические рекомендации по выбору типов

Выбор правильного типа данных — важная часть проектирования программы. Несколько принципов помогают принимать обоснованные решения:

  • Используйте наиболее узкий тип, достаточный для хранения ожидаемых значений. Например, если число никогда не превысит 100, предпочтительнее Byte, а не Integer.
  • Для текстовых данных всегда применяйте String. Избегайте попыток хранить числа или даты в строках — это нарушает целостность данных.
  • При работе с деньгами используйте Decimal, а не Double, чтобы избежать ошибок округления.
  • Если значение может отсутствовать, применяйте nullable-тип (Integer?, Date?).
  • В коллекциях всегда используйте обобщённые типы (List(Of T), Dictionary(Of K, V)), а не необобщённые аналоги.
  • Объявляйте переменные с конкретным типом, а не с Object, даже если это кажется менее гибким. Гибкость достигается через обобщения и интерфейсы, а не через отказ от типизации.

Следование этим рекомендациям делает код более надёжным, эффективным и легко поддерживаемым.


Что дальше

ТемаСтатья
Value и referenceЗначимые и ссылочные типы, преобразования
If, циклыУправляющие конструкции и операторы visual-basic
События, SubПроцедуры и события в visual-basic
КоллекцииКонсоль, CLI, коллекции и файлы

Что попробовать

  1. Включите Option Strict On и исправьте предупреждение компилятора.
  2. Объявите Decimal для суммы с копейками — сравните с Double.
  3. Создайте List(Of Integer) и пройдите For Each.