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

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

вопрос задан 19.11.2008
Nakul Chaudhary
9985 репутация

10 ответов


  • 335 рейтинг

    Оператор 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 / "Баллада об Андалсе и Орелсе" /

    ответ дан Nico, с репутацией 9762, 19.11.2008
  • 28 рейтинг

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

    ответ дан Ed Marty, с репутацией 34936, 19.11.2008
  • 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 также является битовым оператором.

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

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

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

    Dim e = Not 0 And 3
    
    ответ дан Charles Jacks, с репутацией 131, 24.11.2014
  • 12 рейтинг

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

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

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

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

    ответ дан Ian, с репутацией 1679, 26.01.2011
  • 12 рейтинг
    If Bool1 And Bool2 Then
    

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

    If Bool1 AndAlso Bool2 Then
    

    Оценивает Bool2 тогда и только тогда, когда Bool1 имеет значение true.

    ответ дан Bryan Anderson, с репутацией 12808, 19.11.2008
  • 4 рейтинг

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

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

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

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

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

    ответ дан Tor Haugen, с репутацией 12184, 19.11.2008
  • 4 рейтинг

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

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

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

    ответ дан Joel Coehoorn, с репутацией 299287, 19.11.2008
  • 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
    
    ответ дан rbrill, с репутацией 57, 14.12.2011
  • 2 рейтинг

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

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

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

    ответ дан davidallyoung, с репутацией 1014, 16.08.2014
  • 0 рейтинг

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

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

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

    ответ дан Anand, с репутацией 1, 11.06.2015