10 ответов:
The
Andоператор оценивает обе стороны, гдеAndAlsoоценивает правую сторону тогда и только тогда, когда левая сторона истинна.пример:
If mystring IsNot Nothing And mystring.Contains("Foo") Then ' bla bla End Ifвыше вызывает исключение, если
mystring = NothingIf 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иOrin 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