В чем разница между А и А также в VB.NET?

220

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

Теги:
short-circuiting

10 ответов

320
Лучший ответ

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

  • 0
    Ссылка "Больше информации" не работает. Вот новый URL: panopticoncentral.net/2003/08/18/…
  • 0
    просто отредактируйте ответ Рори ... не нужно оставлять неработающие ссылки для людей, чтобы споткнуться :)
Показать ещё 11 комментариев
29

Оператор 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, который бы выбрал исключение.

  • 14
    Если у правой стороны есть побочный эффект, который вам нужен, просто переместите его в левую сторону, а не с помощью «И». Вам действительно нужно «И», если у обеих сторон есть побочные эффекты. И если у вас так много побочных эффектов, вы, вероятно, делаете что-то еще неправильно.
  • 1
    Во-первых, Andalso в первую очередь не используется для «экономии времени выполнения», это нелепо. Во-вторых, наличие второго аргумента для выполнения некоторого полезного «побочного эффекта» - отвратительная плохая практика.
Показать ещё 2 комментария
13

Интересно, что ни один из ответов не упоминал, что 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
  • 0
    Я думаю, что вы запутались || и && с ?? , Пока есть языки где || вернет не-ложное значение, C # не является одним из них и вернет bool (за исключением поднятых операторов, допускающих обнуляемость, где вы получите результат Nullable<bool> )
12

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

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

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

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

12
If Bool1 And Bool2 Then

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

If Bool1 AndAlso Bool2 Then

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

4

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

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


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
  • 3
    Английский язык более запутанный, чем код, потому что у него нет спецификации!
4

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

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

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

4

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

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

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

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

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

2

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

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

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

  • 0
    Также стоит упомянуть IIF (Immediate If), потому что он не замыкает накоротко и может создавать условия, совершенно не похожие на намерения программиста, поскольку оцениваются как истинные, так и ложные компоненты. Ранее кто-то заявлял, что он использует это побочное поведение преднамеренно, но - я не рассматриваю это как эффективный метод, поскольку у Immediate If нет намеренного намерения проводить оценку таким образом, который я могу обнаружить.
  • 0
    «В дополнение к ответам выше, AndAlso также обеспечивает процесс кондиционирования, известный как короткое замыкание». Каждый ответ выше этого посвящен короткому замыканию. : P Но хорошее описание и рекомендации.
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню