Как правильно создать условие If ... Then
Эти примеры покажут как правильно создавать условия, повышая быстродействие и компактность записи. Быстродействие можно заметить в циклах при повторении операций несколько тысяч раз. Следует учитывать, что условие заданное выражением между операторами If и Then может иметь только два логических состояния Да=1=True или Нет=0=False. Значение 0 или пустая строка "" интерпретируются как Нет=0=False, все остальные положительные или отрицательные числа или не пустая строка интерпретируются как Да=1=True. Приоритет операторов в выражении смотрите в разделе "Операторы"
Избавление от вложенности условий
If $k = 8 Then
If $z = 5 Then
Exit
EndIf
EndIf
; Заменить на одно условие
If $k = 8 And $z = 5 Then
Exit
EndIf
Последовательное условие с одинаковым результатом
If $k = 8 Then
Exit
EndIf
If $z = 5 Then
Exit
EndIf
; Заменить на одно условие
If $k = 8 Or $z = 5 Then
Exit
EndIf
Излишнее приравнивание. Вычисляется верность условия 1=1 (верно, и результат 1) или 0=1 (не верно, и результат 0), но возврат успешности функции FileExists уже является результатом верности.
If FileExists($path) = 1 Then Exit
; Заменить на
If FileExists($path) Then Exit
Аналогично предыдущему. Условие заданное выражением между операторами If и Then является одним из двух значения "Да" или "Нет", при этом число 0 приравнивается к Нет=0=False, все остальные значения приравниваются к Да=1=True
If @error<>0 Then Exit
; Заменить на
If @error Then Exit
Аналогично предыдущему. Пустая строка "" приравнивается к Нет=0=False, "не пустая строка" приравнивается к Да=1=True
If $sString <> '' Then Exit
; Заменить на
If $sString Then Exit
Сравнение одного значения с несколькими значениями. Вариант с оператором Switch работает быстрее.
If $k = 3 Or $k = 8 Or $k = 12 Or $k = 43 Or $k = 67 Then Exit
; Заменить на
Switch $k
Case 3, 8, 12, 43, 67
Exit
EndSwitch
Инвертирование
If FileExists($path) = 0 Then Exit
; Заменить на
If Not FileExists($path) Then Exit
Инвертирование с перестановкой блоков
If Not FileExists($sPath) Then
Exit
Else
FileDelete($sPath)
EndIf
; Заменить на
If FileExists($sPath) Then
FileDelete($sPath)
Else
Exit
EndIf
Примеры аналогов
If $k <> 12 Then
If $k - 12 Then
Примеры аналогов
If $a <> 3 And $b <> 5 And $c <> 7 Then
If Not ($a = 3 Or $b = 5 Or $c = 7) Then
Диапазоны
If $k >= 2 And $k <= 8 Then
$k = 3
EndIf
; Аналогично
Switch $k
Case 2 To 8
$k = 3
EndSwitch
Выйти из условия. Если у вас сложное условие, содержащее множество вложенных условий и на разных участках кода проверятся валидность данных, при которых необходимо выйти из условия, то чтобы не усложнять условие блоками можно вставить условие в одношаговый цикл и использовать ExitLoop
Do
If $Trg Then
; ... много кода
$cg = ClipGet()
If $cg = 'Завершить' Then ExitLoop
; ... много кода
Exit
EndIf
Until 1
Неверная конструкция, когда одно и тоже значение сравнивается многократно. Это логически не верно, и медленно, если используется в цикле и при значительном вычислении выражения в условии. Switch в данной конструкции будет вычислять до первого совпадения.
If $n = 5 Then $n = 15
If $n = 3 Then $n = 33
If $n = 8 Then $n = 23
; Заменить на
Switch $n
Case 5
$n = 15
Case 3
$n = 33
Case 8
$n = 23
EndSwitch