В чем разница между And и AndAlso в VB.NET?

In VB.NET, в чем разница между And и AndAlso? Что я должен использовать?

10 ответов


на And оператор оценивает обе стороны, где AndAlso оценивает правую сторону, если и только если левая сторона истинна.

пример:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

выше выбрасывает исключение, если mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

это не вызывает исключения.

поэтому, если вы пришли из мира c#, вы должны использовать AndAlso как вы могли бы использовать &&.

подробнее здесь: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


на And оператор проверит все условия в инструкции перед продолжением, тогда как оператор Andalso остановится, если он знает, что условие ложно. Например:

if x = 5 And y = 7

проверяет, равен ли x 5, и если y равен 7, то продолжается, если оба истинны.

if x = 5 AndAlso y = 7

проверяет, равен ли x 5. Если это не так, он не проверяет, является ли y 7, потому что он знает, что условие уже ложно. (Это называется короткое замыкание.)

обычно люди используют метод короткого замыкания, если есть причина явно не проверять вторую часть, если первая часть не верна, например, если бы она вызвала исключение, если проверено. Например:

If Not Object Is Nothing AndAlso Object.Load()

если используется And вместо AndAlso, он все равно попытается Object.Load() даже если бы это было nothing, что вызвало бы исключение.


интересно, что ни один из ответов не упомянул об этом And и Or в VB.NET битовые операторы а OrElse и AndAlso являются строго логическими операторами.

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

Примечание: ненулевое целое число считается true; Dim e = not 0 устанавливается e to -1 демонстрация Not тоже немного оператора.

|| и && (C# версии OrElse и AndAlso) возвращает последнее вычисленное выражение, которое будет 3 и 5 соответственно. Это позволяет использовать идиому v || 5 в C#, чтобы дать 5 как значение выражения when v is null или (0 и целое число), а значение v иначе. Разница в семантике может поймать программиста C#, балующегося VB.NET off guard, поскольку эта "идиома значения по умолчанию" не работает в VB.NET.

Итак, чтобы ответить на вопрос используйте Or и And для битовых операций (целое число или логическое). Использовать OrElse и AndAlso к" короткому замыканию " деятельность для сохранения времени, или для того чтобы испытать валидность оценки до оценивать ее. If valid(evaluation) andalso evaluation then или if not (unsafe(evaluation) orelse (not evaluation)) then

бонус: какова ценность следующего?

Dim e = Not 0 And 3

If Bool1 And Bool2 Then

оценивает как Bool1, так и Bool2

If Bool1 AndAlso Bool2 Then

оценивает Bool2, если и только если Bool1 верно.


как раз для всех тех людей которые говорят побочные эффекты злы: место где иметь 2 побочных эффекта в одном условии хорошо читало бы 2 объекта файла в тандеме.

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

С помощью And гарантирует, что строка потребляется каждый раз при проверке условия. Тогда как AndAlso может прочитать последнюю строку File1 и оставить File2 без потребленную линии.

конечно код выше не будет работать, но я использую побочные эффекты, как это все время и не стал бы рассматривать это "плохо" или "зло" код, как некоторые могли бы заставить вас поверить. Это легко читать и эффективно.


простой способ подумать об этом-использовать еще более простой английский

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

AndAlso очень похож и, за исключением того, что он работает как && в C#, C++ и т. д.

разница в том, что если первое предложение (перед AndAlso) истинно, второе предложение никогда не оценивается - составное логическое выражение "короткое замыкание".

это иногда очень полезно, например, в таком выражении, как:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

использование старого и в приведенном выше выражении вызовет исключение NullReferenceException, если myObj были null.


Также см. вопрос переполнения стека:должен ли я всегда использовать операторы AndAlso и OrElse?.

также: комментарий для тех, кто пользуется And если правая сторона выражения имеет побочный эффект, вам нужно:

если правая сторона имеет побочный эффект, который вам нужен, просто переместите его в левую сторону, а не с помощью "и". Вам действительно нужно только " и " если и стороны имеют побочные эффекты. И если у тебя так много сторон ... возможно, вы делаете что-то не так. В общем, вы действительно должны предпочесть AndAlso.


в дополнение к ответам выше, AndAlso обеспечивает процесс кондиционирования, известный как короткое замыкание. Многие языки программирования имеют такую функциональность, как vb.net делает и может обеспечить существенное повышение производительности в длинных заявлениях о состоянии, вырезая оценки, которые являются ненужными.

другое подобное условие условие OrElse которое только проверило бы правое условие если левое условие ложно, то таким образом режущ вне ненужное проверка состояния после обнаружения истинного состояния.

Я бы посоветовал вам всегда использовать процессы короткого замыкания и структурировать ваши условные утверждения таким образом, чтобы это могло принести наибольшую пользу. Например, сначала проверьте свои самые эффективные и быстрые условия, чтобы вы выполняли свои длинные условия только тогда, когда вам абсолютно необходимо, и короткое замыкание в других случаях.


для большинства из нас OrElse и AndAlso сделают трюк, за исключением нескольких запутанных исключений (менее 1%, где нам, возможно, придется использовать или и и).

старайтесь не увлекаться людьми, демонстрирующими свою булеву логику и делающими ее похожей на ракетостроение.

Это довольно просто и прямо вперед, и иногда ваша система может работать не так, как ожидалось, потому что ей не нравится ваша логика в первую очередь. И все же твой мозг продолжает говорить тебе, что его логика на 100% проверена и доказана, и она должна работать. В этот момент перестаешь доверять свой мозг и попросить его подумать еще раз или (не Если или может быть иначе) вы заставить себя искать другую работу, которая не требует много логики.