Подтвердить что ты не робот

(OrElse и Or) и (AndAlso и And) - Когда использовать?

В чем разница между (OrElse и Or) и (AndAlso и And)? Есть ли разница в их выступлениях, скажем, правильность выгоды? Есть ли ситуация, когда я не использую OrElse и AndAlso?

4b9b3361

Ответ 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