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

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

Ответ 1

Оператор 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

Это исключение не генерирует.

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

Дополнительная информация здесь: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

Ответ 2

Оператор 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()

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

Ответ 3

Интересно, что ни один из ответов не упоминал, что 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 в -1, демонстрируя Not также бит-оператор.

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

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

Бонус: Каково значение следующего?

Dim e = Not 0 And 3

Ответ 4

If Bool1 And Bool2 Then

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

If Bool1 AndAlso Bool2 Then

Оценивает Bool2 тогда и только тогда, когда Bool1 является истинным.

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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


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

Ответ 9

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

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

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

Ответ 10

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

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

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