В чем разница между VB.NET And
и AndAlso
? Какой я должен использовать?
В чем разница между VB.NET And
и AndAlso
? Какой я должен использовать?
Ответы:
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/
Then
это его собственное ключевое слово.
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
если у них нет причин - из которых, я думаю, законных мало и далеко. Конечно, есть причина, по которой большинство других языков по умолчанию замыкаются: он сохраняет смысл результата, не оценивая потенциально дорогостоящие выражения, когда они ничего не вносят. Побочные эффекты в условиях должны быть, ну, в общем, побочными. Но это только мое мнение ...
Интересно, что ни в одном из ответов не упоминалось, что 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
также немного оператора.
||
и &&
(версии C # OrElse
и AndAlso
) возвращают последнее оцененное выражение, которое будет 3
и 5
соответственно. Это позволяет вам использовать идиому v || 5
в C #, чтобы дать 5
в качестве значения выражения когда v
is 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
||
и &&
с ??
. В то время как есть языки, которые ||
будут возвращать не ложное значение, C # не является одним из них и возвращает a bool
(за исключением поднятых обнуляемых операторов, где вы получаете Nullable<bool>
результат)
If Bool1 And Bool2 Then
Оценивает как Bool1 и Bool2
If Bool1 AndAlso Bool2 Then
Оценивает Bool2 тогда и только тогда, когда Bool1 имеет значение true.
Просто для всех тех людей, которые говорят, что побочные эффекты являются злом: место, где наличие двух побочных эффектов в одном условии - это хорошо, будет читать два файловых объекта в тандеме.
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
And также очень похож на And, за исключением того, что он работает как && в C #, C ++ и т. Д.
Разница заключается в том, что если первое предложение (то, которое находится перед AndAlso) является истинным, второе предложение никогда не оценивается - составное логическое выражение является «короткозамкнутым».
Это иногда очень полезно, например, в выражении, таком как:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
Использование старого выражения And в вышеприведенном выражении вызовет исключение NullReferenceException, если myObj будет нулевым.
Также см. Вопрос переполнения стека. Должен ли я всегда использовать операторы AndAlso и OrElse? ,
Также: Комментарий для тех, кто упомянул использование, And
если правая сторона выражения имеет побочный эффект, который вам нужен:
Если у правой стороны есть побочный эффект, который вам нужен, просто переместите его в левую сторону, а не с помощью «И». Вам действительно нужно «И», если у обеих сторон есть побочные эффекты. И если у вас так много побочных эффектов, вы, вероятно, делаете что-то еще неправильно. В общем, вы действительно должны предпочесть AndAlso.
В дополнение к ответам выше, AndAlso также обеспечивает процесс кондиционирования, известный как короткое замыкание. Многие языки программирования имеют такую встроенную функциональность, как и vb.net, и могут обеспечить существенное повышение производительности в длинных операторах условий, исключая ненужные оценки.
Другим аналогичным условием является условие OrElse, которое проверяет правильное условие только в том случае, если левое условие ложно, таким образом исключая ненужные проверки условий после обнаружения истинного условия.
Я бы посоветовал вам всегда использовать процессы короткого замыкания и структурировать ваши условные выражения так, чтобы это могло принести наибольшую пользу. Например, сначала проверьте свои самые эффективные и самые быстрые условия, чтобы длительные условия выполнялись только тогда, когда вам абсолютно необходимо, и короткое замыкание в другое время.
Для большинства из нас OrElse и AndAlso сделают свое дело, за исключением нескольких запутанных исключений (менее 1%, когда нам, возможно, придется использовать Or и And).
Постарайтесь не увлекаться людьми, которые хвастаются своей логической логикой и делают ее похожей на ракетостроение.
Это довольно просто и прямо, и иногда ваша система может работать не так, как ожидалось, потому что она не любит вашу логику в первую очередь. И все же ваш мозг постоянно говорит вам, что его логика на 100% проверена и доказана, и она должна работать. В этот самый момент перестаньте доверять своему мозгу и попросите его подумать еще раз, или (не OrElse или, возможно, OrElse) вы заставите себя искать другую работу, которая не требует большой логики.
Вариант использования:
с «И» компилятор проверит все условия, поэтому, если вы проверяете, что объект может быть «Ничем», а затем вы проверяете одно из его свойств, у вас будет ошибка времени выполнения.
Но с AndAlso с первым «ложным» в условиях он будет проверять следующее, чтобы у вас не было ошибки.