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



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

741   10  

10 ответов:

The 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/

The 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 in 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 также является битовым оператором.

|| и && (C# версии OrElse и AndAlso) возвращает последнее вычисленное выражение, которое будет 3 и 5 соответственно. Это позволяет использовать идиому v || 5 в C# дать 5 как значение выражения, когда v и null или (0 и целое число), а значение v в противном случае. Разница в семантике может поймать программиста C#, занимающегося VB.NET застигнутый врасплох, поскольку эта идиома значения по умолчанию не работает 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 истинно.

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

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 очень похоже на And, за исключением того, что он работает как && в C#, C++ и т. д.

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.