Or/And
будет всегда оценивать оба 1 выражения и затем возвращает результат. Они не короткозамкнуты.
OrElse/AndAlso
являются короткозамкнутыми . Правое выражение оценивается, только если результат не может быть определен на основе оценки только левого выражения. (Это означает, что OrElse
будет оценивать правое выражение только в том случае, если левое выражение ложно, а AndAlso
будет оценивать правое выражение только в том случае, если левое выражение истинно.)
Если предположить, что никаких побочных эффектов не возникает в выражениях, а выражения не являются зависимыми (и любые издержки выполнения игнорируются), то они одинаковы.
Однако во многих случаях выражения зависят от . Например, мы хотим что-то сделать, когда List не равен Nothing и имеет более одного элемента:
If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff
Это также можно использовать, чтобы избежать "дорогих" вычислений (или побочных эффектов, ick!):
If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid
Лично я считаю, что AndAlso
и OrElse
являются правильными операторами, которые можно использовать во всех случаях, кроме 1% - или, надеюсь, меньше! - из случаев, когда побочный эффект является желательным .
Удачного кодирования.
1 Исключение, сгенерированное в первом выражении, предотвратит оценку второго выражения, но это вряд ли должно удивлять.