В чем разница между (OrElse и Or) и (AndAlso и And)? Есть ли разница в их выступлениях, скажем, правильность выгоды? Есть ли ситуация, когда я не использую OrElse и AndAlso?
(OrElse и Or) и (AndAlso и And) - Когда использовать?
Ответ 1
Or/And
всегда будет оценивать выражения 1 и затем возвращать результат. Они не имеют короткого замыкания.
OrElse/AndAlso
short-circuiting. Правильное выражение оценивается только в том случае, если результат не может быть определен из оценки только левого выражения. (Это означает: OrElse
будет оценивать только правильное выражение, если левое выражение ложно, а AndAlso
будет оценивать только правильное выражение, если левое выражение истинно.)
Предполагая, что в выражениях нет побочных эффектов, и выражения не зависят (и любые служебные служебные данные игнорируются), то они одинаковы.
Однако во многих случаях эти выражения зависят. Например, мы хотим что-то сделать, когда List is not-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 Исключение, возникшее в первом выражении, предотвратит оценку второго выражения, но это вряд ли будет удивительным.
Ответ 2
Помимо короткого замыкания, упомянутого в других ответах, Or
/And
можно использовать как побитовые операторы, где OrElse
/AndAlso
нет. Побитовые операции включают объединение значений перечислений флагов, таких как FileAttributes перечисление, в котором вы можете указать, что файл является только для чтения и скрыт FileAttributes.ReadOnly Or FileAttributes.Hidden
Ответ 3
Различие заключается в том, что OrElse и AndAlso будут замыкаться на короткое замыкание на основе первого условия, а это означает, что если первое условие не пройдет, второе (или более) условие не будет оценено. Это особенно полезно, когда одно из условий может быть более интенсивным, чем другое.
Пример, где Or
отлично (оба условия оценены):
If Name = "Fred" Or Name = "Sam" Then
Не важно, в какой степени они оцениваются
Следующий AndAlso
полезен, потому что второе условие может выйти из строя
If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then
Это позволяет первому условию проверить, был ли объект установлен и только если он был установлен, будет проверяться база данных (или какая-либо другая задача). Если это было простое ключевое слово And
, то оба будут оцениваться.
Ответ 4
@Гидеон - рад, что кто-то указал на это. Вот простой тест, который показывает драматическое влияние AndAlso:
Dim tm As New Stopwatch
Const tries As Integer = 123456
Dim z As Integer = 0
Dim s() As String = New String() {"0", "one"}
Debug.WriteLine("AndAlso")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Debug.WriteLine("And")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next