Опубликован: 31.08.2006 | Уровень: специалист | Доступ: платный
Лекция 7:

Использование условных структур

"Закорачивание" с помощью AndAlso и OrElse

Visual Basic .NET предлагает два логических оператора, которые можно использовать в условных выражениях - AndAlso и OrElse. Эти операторы работают точно так же, как And и Or соответственно, но несколько по-другому вычисляются. Это отличие будет новым для тех программистов, которые уже имеют опыт работы с предыдущими версиями Visual Basic.

Рассмотрим оператор If, который содержит два условия, связанные оператором AndAlso. Чтобы выполнились операторы структуры If, необходимо, чтобы оба условия были равны True. Если первое условие равно False, то Visual Basic .NET немедленно перейдет к следующей строке или оператору Else, не проверяя второго условия. Такое частичное, или укороченное, вычисление оператора If имеет логический смысл - зачем Visual Basic должен продолжать проверять оператор If, если оба условия не могут быть равны True?

Оператор OrElse работает аналогичным образом. Рассмотрим оператор If, который содержит два условия, связанные с оператором OrElse. Чтобы выполнились операторы структуры If, необходимо, чтобы хотя бы одно из условий было равны True. Если первое условие равно True, то Visual Basic .NET немедленно перейдет к выполнению операторов в структуре If, не проверяя второго условия.

Вот пример такой короткой ситуации в Visual Basic .NET - это простая процедура, которая использует оператор If и оператор AndAlso для проверки двух условий и отображения сообщения "Внутри If" при условии, что оба условия равны True:

Dim Number As Integer = 0
If Number = 1 AndAlso MsgBox("Проверка второго условия") Then
MsgBox("Внутри If")
Else
MsgBox("Внутри Else")
End If

Функция MsgBox сама используется как вторая проверка условия, что несколько необычно, но странная запись полностью корректна и дает нам прекрасную возможность увидеть в деталях, как работает "закорачивание". Текст "Проверка второго условия" появляется в окне сообщения только тогда, когда переменная Number равна 0; в противном случае оператор AndAlso обходит выражение If, и вторая часть условия не вычисляется. Если вы попробуете запустить этот код, помните, что он предназначен только для демонстрации - вы не станете использовать MsgBox в такой записи потому, что на самом деле она ничего не проверяет. Но, изменяя значение переменной Number с 0 на 1 и обратно, вы можете представить себе, как работает оператор AndAlso и обход проверки условий.

Вот второй пример того, как работает "закорачивание" в Visual Basic .NET, когда два условия проверяются с помощью оператора AndAlso. На этот раз после оператора AndAlso используется более сложное условие ( 7 / HumanAge <= 1 ), которое пересчитывает возраст человека в число собачьих жизней:

Dim HumanAge As Integer
HumanAge = 7
' Один год для собаки - это семь лет для человека
If HumanAge <> 0 AndAlso 7 / HumanAge <= 1 Then
MsgBox("Вам как минимум один ""собачий""  год")
Else
MsgBox("Вам менее одного "собачьего" года ")
End If

Эта процедура пытается определить, равно ли значение в целой переменной HumanAge, по крайней мере, 7. Она является частью более сложной программы, которая определяет так называемые "собачий" возраст человека, поделив его текущий возраст на 7. (Если вы раньше не слышали о концепции "собачьего" возраста, то слушайте - следуя этой логике, человеку, которому 28 лет, исполнилось 4 "собачьих" года.) Этот код использует в операторе If два условия и может быть использован в различных условиях - я использовал его в процедуре события Click для объекта кнопки. Первое условие проверяет, не равно ли значение переменной HumanAge нулю - я предположил, что пользователь - достаточно здравомыслящий человек, и введет в HumanAge положительный возраст, так как отрицательное значение приведет к неверным результатам. Второе условие проверяет, равен ли возраст человека, по крайней мере, семи. Если оба условия имеют значение True, то в окне сообщения отображается сообщение "Вам как минимум один "собачий" год". Если человеку меньше семи лет, то отображается сообщение "Вам менее одного "собачьего" года". Теперь представьте, что я изменил значение переменной HumanAge с 7 на 0. Что произойдет? Компилятор Visual Basic .NET определяет, что первое условие оператора If становится равным False, и это предотвращает вычисление второго условия, таким образом останавливая, или "закорачивая", оператор If и уберегая нас от ужасной ошибки "деление на ноль", которая возникла бы, если бы мы разделили 7 на 0 (Новое значение переменной HumanAge ). Хотя у нас и есть возможность воспользоваться преимуществами "закорачивания" в Visual Studio .NET, у нас нет такой же возможности в Visual Basic 6. Установка переменной HumanAge на 0 при использовании Visual Basic 6 приведет к возникновению ошибки времени исполнения и обрушению программы, так как вычисляется весь оператор If, а деление на 0 в Visual Basic 6 запрещено.

В качестве резюме можно сказать, что операторы AndAlso и OrElse в Visual Basic .NET дают программистам на Visual Basic несколько новых возможностей, включая предотвращение потенциальных ошибок времени исполнения и других неожиданных результатов. Стало также возможно увеличить производительность, поместив условия, которые требуют для своего вычисления много времени, в конце условного оператора. Visual Basic .NET не будет выполнять эти дорогостоящие вычисления условий до тех пор, пока это станет необходимо. Однако вы должны тщательно продумать все возможные условия, с которыми могут столкнуться операторы If при изменении состояний переменных во время выполнении программы.

Структуры выбора Select Case

Для управления исполнением операторов программы часто применяется структура выбора Select Case. В лекциях "Работа с элементами управления из области элементов" и "Переменные и операторы Visual Basic .NET" этой книги вы уже использовали структуры Select Case, когда писали процедуры событий для обработки выбора элементов списков и раскрывающихся списков. Структура Select Case аналогична структуре If...Then...ElseIf, но она более эффективна, когда разветвление зависит от одной ключевой переменной. При использовании Select Case ваш код будет удобнее читать.

Синтаксис структуры Select Case следующий.

Select Case переменная
Case значение1
операторы программы, исполняемые, если переменная содержит значение 1
Case значение 2
операторы программы, исполняемые, если переменная содержит значение 2
Case значение 3
операторы программы, исполняемые, если переменная содержит значение 3
...
Case Else
операторы программы, исполняемые, если совпадения не найдено"
End Select

Структура Select Case начинается с ключевых слов Select Case и заканчивается ключевыми словами End Select. В качестве переменной вы можете использовать переменную, свойство или другое выражение, которое будет ключевым значением, т.е. проверяемым условием этой структуры. Значения значение 1, значение 2 и значение 3 можно заменить числами, строками или другими значениями, связанными с проверяемым условием. Если одно из этих значений совпадает со значением variable, то выполняются операторы, расположенные за соответствующим ему разделом Case. Затем Visual Basic переходит к строке, расположенной после оператора End Select и начинает с него дальнейшее исполнение кода. Вы можете включить в структуру Select Case любое количество выражений Case, а в каждое из этих выражений Case несколько значений. Если вы перечисляете несколько значений, разделяйте их запятыми.

В следующем примере показано, как структура Select Case используется в программе для печати нужного сообщения о возрасте человека. Если переменная Age содержит значение 18, то свойству Text объекта метки присваивается строка "Теперь вы можете участвовать в выборах!".

Dim Age As Integer
Age = 18

Select Case Age
Case 16
Label1.Text = "Теперь вы можете водить машину!"
Case 18
Label1.Text = "Теперь вы можете участвовать в выборах!"
Case 21
Label1.Text = "Теперь вы можете пить вино."
Case 65
Label1.Text = "Теперь вы можете уволиться и жить в свое удовольствие!"
End Select

Структура Select Case поддерживает также оператор Case Else, который можно использовать для отображения сообщений, если со значением переменной не совпадает ни одно из предшествующих значений. Вот как Case Else будет работать в следующем примере. Обратите внимание, что я изменил значение Age на 25, чтобы активизировать вариант Case Else.

Dim Age As Integer
Age = 25

Select Case Age
Case 16
Label1.Text = "Теперь вы можете водить машину!"
Case 18
Label1.Text = "Теперь вы можете участвовать в выборах!"
Case 21
Label1.Text = "Теперь вы можете пить вино."
Case 65
Label1.Text = "Теперь вы можете уволиться и жить в свое удовольствие!"
Case Else
Label1.Text = "Вы в полном расцвете сил!"
End Select
Сайдахмад Зарипов
Сайдахмад Зарипов
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?

Виталий Григорьев
Виталий Григорьев
Россия, москва, мгсги, 2011
Надежда Серекпаева
Надежда Серекпаева
Россия, Тюмень, Тюменский индустриальный институт, 1992