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

Управляющие конструкции и операторы visual-basic

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

Перед чтением: Операторы — общие понятия оператора, операнда, приоритетов и типов операций без привязки к языку.

Сначала: Циклы в коде — общая идея повторений, виды циклов и типичные ошибки без привязки к синтаксису языка.


Управляющие конструкции и операторы visual-basic

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

Читайте от роли конструкций к If / Select Case / циклам For и Do. Нужны типы; дальше — процедуры и события.


Управление потоком в Visual Basic

WinForms и консольный VB.NET строятся на событиях и ветвлениях; явный выбор цикла упрощает чтение обработчиков.

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

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


Общая роль управляющих конструкций

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

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


Операторы как основа выражений

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

VB6/VBA и VB.NET — не путать набор операторов. В классическом VB были Eqv и Imp (эквивалентность и импликация); в VB.NET их нет. Зато в .NET появились AndAlso и OrElse (краткое вычисление; в VB6 аналог — And/Or с осторожностью). Для строк в VB6 часто пишут & (принудительная конкатенация), в .NET достаточно & или интерполяции $"…". Оператор Like (шаблоны, например str Like "*@*.*") сохранился в обеих ветвях. Целочисленное деление: \ и остаток Mod — как в BASIC с давних пор.


Арифметические операторы

Арифметические операторы применяются к числовым значениям и возвращают результат математической операции. visual-basic поддерживает следующие арифметические операторы:

  • + — сложение двух чисел
  • - — вычитание одного числа из другого или указание отрицательного значения
  • * — умножение
  • / — деление с получением результата типа Double, даже если оба операнда целочисленные
  • \ — целочисленное деление, возвращает только целую часть частного
  • Mod — оператор получения остатка от деления
  • ^ — возведение в степень

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


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

Операторы сравнения применяются для проверки отношений между двумя значениями. Результатом любого сравнения является логическое значение: True или False. Эти значения напрямую используются в условиях управляющих конструкций, таких как If...Then...Else или While...End While.

visual-basic предоставляет следующие операторы сравнения:

  • = — равенство
  • <> — неравенство
  • < — меньше
  • <= — меньше или равно
  • > — больше
  • >= — больше или равно

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


Оператор конкатенации

Оператор & служит для объединения строк. Он принимает два строковых операнда и возвращает новую строку, состоящую из первого операнда, за которым следует второй. Если один из операндов не является строкой, visual-basic автоматически преобразует его в строковое представление перед выполнением конкатенации. Это поведение делает оператор & безопасным и удобным для формирования сообщений, путей к файлам, SQL-запросов и других составных строк.

Важно отличать оператор & от арифметического оператора +. Хотя в некоторых контекстах + может использоваться для объединения строк, такое использование считается менее надёжным, поскольку может привести к неоднозначности — если оба операнда числовые, будет выполнено сложение, а не конкатенация. Оператор & всегда трактуется как конкатенация, что делает код более предсказуемым и читаемым.

В VB.NET удобна интерполяция строк: $"Привет, {userName}" — предпочтительнее длинных цепочек &.


Конструкция If...Then...Else

Конструкция If...Then...Else — основной механизм принятия решений в visual-basic. Она позволяет выполнять определённый блок кода, если заданное условие истинно, и, при необходимости, другой блок кода, если условие ложно.

Простейшая форма конструкции выглядит так:

If condition Then
' блок кода, выполняемый при истинности условия
End If

Здесь condition — это выражение, результатом которого является логическое значение. Если результат True, управление передаётся внутрь блока между Then и End If. Если результат False, блок пропускается, и выполнение программы продолжается со следующей строки после End If.

Расширенная форма конструкции включает ветку Else:

If condition Then
' код для случая, когда условие истинно
Else
' код для случая, когда условие ложно
End If

Эта форма обеспечивает полное покрытие обоих возможных исходов логического выражения.

Для обработки нескольких взаимоисключающих условий используется конструкция ElseIf:

If condition1 Then
' действия при выполнении условия1
ElseIf condition2 Then
' действия при выполнении условия2
ElseIf condition3 Then
' действия при выполнении условия3
Else
' действия по умолчанию
End If

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

Все условия в If...Then...Else могут быть составными, то есть включать логические операторы And, Or, Not, а также комбинировать различные операторы сравнения и арифметические выражения. Такой подход даёт возможность точно описывать сложные бизнес-правила или условия пользовательского интерфейса.


Конструкция Select Case

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

Общий синтаксис конструкции выглядит следующим образом:

Select Case expression
Case value1
' действия, если выражение равно value1
Case value2
' действия, если выражение равно value2
Case value3 To value4
' действия, если выражение попадает в диапазон
Case Is > threshold
' действия, если выражение удовлетворяет условию сравнения
Case Else
' действия по умолчанию
End Select

Здесь выражение вычисляется один раз в начале выполнения конструкции. Затем его результат последовательно сравнивается с каждым блоком Case. Как только найдено совпадение, выполняется соответствующий блок кода, после чего управление немедленно передаётся за пределы всей конструкции Select Case. Это означает, что даже если результат удовлетворяет нескольким условиям, будет выполнен только первый подходящий блок.

Варианты указания значений в блоках Case весьма гибкие:

  • Можно перечислять несколько конкретных значений через запятую — Case 1, 3, 5
  • Можно задавать диапазоны с помощью ключевого слова To: Case 10 To 20
  • Можно использовать операторы сравнения с ключевым словом Is: Case Is >= 100
  • Для строковых значений допустимы точные совпадения: Case "Администратор", "Модератор"

Конструкция Select Case особенно полезна при обработке пользовательского ввода, разборе кодов ошибок, маршрутизации команд или реализации конечных автоматов. Она делает логику выбора прозрачной и легко расширяемой: добавление нового варианта требует лишь вставки нового блока Case без изменения существующей структуры.

Интерактивное демо — на JavaScript (логика итераций та же). В VB.NET — For i = 1 To 5, For Each x In list, While…End While, Do…Loop. См. также циклы в коде.

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


Цикл For...Next

Цикл For...Next предназначен для выполнения блока кода заранее известное количество раз. Он использует специальную переменную-счётчик, которая автоматически изменяется на каждой итерации. Этот тип цикла идеален для обхода массивов, коллекций с числовыми индексами или выполнения повторяющихся действий фиксированное число раз.

Синтаксис цикла:

For counter = startValue To endValue [Step stepValue]
' тело цикла
Next [counter]

Переменная counter инициализируется значением startValue. Перед каждой итерацией проверяется, не превышает ли текущее значение счётчика endValue (или не стало ли меньше, если шаг отрицательный). Если условие соблюдается, выполняется тело цикла. После завершения тела значение счётчика увеличивается на stepValue. Если Step не указан, по умолчанию используется шаг, равный единице.

Пример с положительным шагом:

For i = 1 To 5
Console.WriteLine("Итерация " & i)
Next i

Пример с отрицательным шагом:

For i = 10 To 1 Step -1
Console.WriteLine("Обратный отсчёт: " & i)
Next i

Шаг может быть дробным, хотя это используется реже и требует осторожности из-за особенностей представления чисел с плавающей точкой. Переменная-счётчик обычно объявляется непосредственно в заголовке цикла, но может быть и ранее объявленной переменной. После завершения цикла переменная сохраняет своё последнее значение.

Цикл For...Next гарантирует, что тело выполнится как минимум ноль раз (если начальное значение сразу выходит за пределы диапазона) и не более заданного количества итераций. Это делает его предсказуемым и безопасным от бесконечных зацикливаний при корректном задании границ.


For Each…Next

Обход коллекции или массива без индекса:

Dim names As String() = {"Anna", "Boris", "Vera"}
For Each name In names
Console.WriteLine(name)
Next

Досрочный выход: Exit For. Переход к следующей итерации: Continue For (VB 9+).


Цикл While...End While

Цикл While...End While выполняет блок кода до тех пор, пока заданное условие остаётся истинным. Проверка условия происходит до каждой итерации, включая первую. Это означает, что если условие изначально ложно, тело цикла не выполнится ни разу.

Синтаксис:

While condition
' тело цикла
End While

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

Пример:

Dim temperature As Integer = 100
While temperature > 25
temperature = temperature - 5
Console.WriteLine("Текущая температура: " & temperature)
End While

Этот цикл моделирует охлаждение объекта до комнатной температуры. На каждой итерации значение переменной уменьшается, приближаясь к порогу, при котором условие станет ложным.

Цикл While хорошо подходит для ситуаций, когда точное количество итераций заранее неизвестно, но существует чёткий критерий завершения — например, ожидание события, чтение данных до конца файла или выполнение операции до достижения желаемого результата.


Цикл Do...Loop

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


Вариант 1 — Do While...Loop

Проверка условия выполняется в начале. Цикл продолжается, пока условие истинно.

Do While condition
' тело цикла
Loop

Этот вариант полностью эквивалентен While...End While.


Вариант 2 — Do Until...Loop

Проверка условия также в начале, но цикл продолжается, пока условие ложно. Как только условие становится истинным, цикл завершается.

Do Until condition
' тело цикла
Loop

Это удобная форма, когда естественным образом формулируется условие завершения, а не условие продолжения.


Вариант 3 — Do...Loop While

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

Do
' тело цикла
Loop While condition

Вариант 4 — Do...Loop Until

Аналогично предыдущему, но цикл повторяется, пока условие остаётся ложным. Проверка в конце.

Do
' тело цикла
Loop Until condition

Наличие четырёх форм позволяет выбрать наиболее выразительный и логически прозрачный способ записи цикла. Например, если требуется запросить у пользователя данные и повторять запрос, пока он не введёт корректное значение, естественно использовать Do...Loop Until, где условие — это успешная валидация ввода.

Все циклы Do...Loop требуют внимательного контроля за изменением переменных в теле цикла, чтобы избежать бесконечного выполнения. Язык visual-basic предоставляет оператор Exit Do, который позволяет досрочно прервать цикл из любого места его тела при выполнении дополнительного условия.


Взаимосвязь операторов и управляющих конструкций

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

Правильный выбор конструкции зависит от контекста задачи:

  • Для простого условия — If...Then
  • Для множественного выбора по одному значению — Select Case
  • Для фиксированного числа повторений — For...Next
  • Для повторений с неизвестным числом итераций и проверкой в начале — While или Do While/Until
  • Для гарантированного хотя бы одного выполнения — Do...Loop While/Until

Эти конструкции могут вкладываться друг в друга произвольным образом, создавая сложные логические структуры. Однако чрезмерная вложенность снижает читаемость кода. В таких случаях рекомендуется выносить части логики в отдельные процедуры или функции.


Практические шаблоны без лишней теории

Ниже три типовых заготовки, которые часто реально нужны в VB.NET-проектах.

  1. Валидация ввода
If String.IsNullOrWhiteSpace(userName) Then
MessageBox.Show("Введите имя.")
Exit Sub
End If
  1. Маршрутизация по статусу
Select Case orderStatus
Case "New"
ProcessNewOrder()
Case "Paid"
ShipOrder()
Case "Cancelled"
ArchiveOrder()
Case Else
LogUnknownStatus(orderStatus)
End Select
  1. Цикл с безопасным выходом
Do
Dim line = Console.ReadLine()
If line Is Nothing OrElse line = "exit" Then
Exit Do
End If
Console.WriteLine("Получено: " & line)
Loop

Когда выбирать If, а когда Select Case

СитуацияЛучше использовать
1-2 условия, разные выраженияIf...ElseIf
Много веток по одному значениюSelect Case
Есть диапазоны и фиксированные категорииSelect Case
Сложная логика с несколькими переменнымиIf...ElseIf + вынести часть в Function

Главный критерий: через месяц код должен читаться без "раскопок" контекста.


Что дальше

ТемаСтатья
Sub, Function, событияПроцедуры и события в visual-basic
ТипыТипы данных в visual-basic
Архитектура VBАрхитектура приложений на visual-basic
Первая программаПервая программа на visual-basic

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

  1. Перепишите пример с Select Case под меню из трёх пунктов.
  2. Замените For на Do While с Exit Do.
  3. Вынесите ветвление в отдельный Function и вызовите из Sub.