В чем разница между VB.NET And
и AndAlso
? Какой я должен использовать?
vb.net
short-circuiting
Накул Чаудхари
источник
источник
Then
это его собственное ключевое слово.And
Оператор проверит все условия в заявлении , прежде чем продолжить, в то время как оператор AndAlso остановится , если он знает , что условие ложно. Например:Проверяет, равен ли x 5, а если y равен 7, то продолжается, если оба значения верны.
Проверяет, равен ли x 5. Если это не так, он не проверяет, равен ли y 7, потому что он знает, что условие уже ложно. (Это называется коротким замыканием.)
Обычно люди используют метод короткого замыкания, если есть причина явно не проверять вторую часть, если первая часть не соответствует действительности, например, если она выбрасывает исключение, если проверено. Например:
Если бы он использовался
And
вместоAndAlso
, он все равно попыталсяObject.Load()
бы сделать этоnothing
, даже если бы это было так , что породило бы исключение.источник
and
/or
если у них нет причин - из которых, я думаю, законных мало и далеко. Конечно, есть причина, по которой большинство других языков по умолчанию замыкаются: он сохраняет смысл результата, не оценивая потенциально дорогостоящие выражения, когда они ничего не вносят. Побочные эффекты в условиях должны быть, ну, в общем, побочными. Но это только мое мнение ...Интересно, что ни в одном из ответов не упоминалось, что
And
иOr
в VB.NET есть битовые операторы, тогда какOrElse
иAndAlso
являются строго булевыми операторами.Примечание : считается ненулевое целое число
true
;Dim e = not 0
Установимe
для-1
демонстрацииNot
также немного оператора.||
и&&
(версии C #OrElse
иAndAlso
) возвращают последнее оцененное выражение, которое будет3
и5
соответственно. Это позволяет вам использовать идиомуv || 5
в C #, чтобы дать5
в качестве значения выражения когдаv
isnull
или (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
Бонус: какова ценность следующего?
источник
||
и&&
с??
. В то время как есть языки, которые||
будут возвращать не ложное значение, C # не является одним из них и возвращает abool
(за исключением поднятых обнуляемых операторов, где вы получаетеNullable<bool>
результат)Оценивает как Bool1 и Bool2
Оценивает Bool2 тогда и только тогда, когда Bool1 имеет значение true.
источник
Просто для всех тех людей, которые говорят, что побочные эффекты являются злом: место, где наличие двух побочных эффектов в одном условии - это хорошо, будет читать два файловых объекта в тандеме.
Использование
And
гарантирует, что строка используется каждый раз, когда проверяется условие. Принимая во внимание, чтоAndAlso
может прочитать последнюю строкуFile1
и оставитьFile2
без использованной строки.Конечно, приведенный выше код не будет работать, но я использую подобные побочные эффекты все время и не буду считать его « плохим » или « злым » кодом, как некоторые заставят вас поверить. Это легко читать и эффективно.
источник
Простой способ думать об этом - использовать еще более простой английский
источник
And также очень похож на And, за исключением того, что он работает как && в C #, C ++ и т. Д.
Разница заключается в том, что если первое предложение (то, которое находится перед AndAlso) является истинным, второе предложение никогда не оценивается - составное логическое выражение является «короткозамкнутым».
Это иногда очень полезно, например, в выражении, таком как:
Использование старого выражения And в вышеприведенном выражении вызовет исключение NullReferenceException, если myObj будет нулевым.
источник
Также см. Вопрос переполнения стека. Должен ли я всегда использовать операторы AndAlso и OrElse? ,
Также: Комментарий для тех, кто упомянул использование,
And
если правая сторона выражения имеет побочный эффект, который вам нужен:Если у правой стороны есть побочный эффект, который вам нужен, просто переместите его в левую сторону, а не с помощью «И». Вам действительно нужно «И», если у обеих сторон есть побочные эффекты. И если у вас так много побочных эффектов, вы, вероятно, делаете что-то еще неправильно. В общем, вы действительно должны предпочесть AndAlso.
источник
В дополнение к ответам выше, AndAlso также обеспечивает процесс кондиционирования, известный как короткое замыкание. Многие языки программирования имеют такую встроенную функциональность, как и vb.net, и могут обеспечить существенное повышение производительности в длинных операторах условий, исключая ненужные оценки.
Другим аналогичным условием является условие OrElse, которое проверяет правильное условие только в том случае, если левое условие ложно, таким образом исключая ненужные проверки условий после обнаружения истинного условия.
Я бы посоветовал вам всегда использовать процессы короткого замыкания и структурировать ваши условные выражения так, чтобы это могло принести наибольшую пользу. Например, сначала проверьте свои самые эффективные и самые быстрые условия, чтобы длительные условия выполнялись только тогда, когда вам абсолютно необходимо, и короткое замыкание в другое время.
источник
Для большинства из нас OrElse и AndAlso сделают свое дело, за исключением нескольких запутанных исключений (менее 1%, когда нам, возможно, придется использовать Or и And).
Постарайтесь не увлекаться людьми, которые хвастаются своей логической логикой и делают ее похожей на ракетостроение.
Это довольно просто и прямо, и иногда ваша система может работать не так, как ожидалось, потому что она не любит вашу логику в первую очередь. И все же ваш мозг постоянно говорит вам, что его логика на 100% проверена и доказана, и она должна работать. В этот самый момент перестаньте доверять своему мозгу и попросите его подумать еще раз, или (не OrElse или, возможно, OrElse) вы заставите себя искать другую работу, которая не требует большой логики.
источник
Чтобы понять словами, а не тресками:
Вариант использования:
с «И» компилятор проверит все условия, поэтому, если вы проверяете, что объект может быть «Ничем», а затем вы проверяете одно из его свойств, у вас будет ошибка времени выполнения.
Но с AndAlso с первым «ложным» в условиях он будет проверять следующее, чтобы у вас не было ошибки.
источник