Что лучше для производительности?И против AndAlso - PullRequest
20 голосов
/ 15 июля 2011

При написании оператора If я всегда использовал And при необходимости, например:

If 1=1 And 2=2 Then

Единственный раз, когда я использовал AndAlso, это если второе условие будет ошибочным, если первое не истинно, например:

If Not IsDbNull(Value) AndAlso Value=2 Then

Однако недавно я слышал, что AndAlso лучше по производительности, чем And, поскольку второе условие читается только тогда, когда первое истинно.

В этом случае я должен всегда просто использовать AndAlso?

Ответы [ 3 ]

36 голосов
/ 15 июля 2011

Да, AndAlso может быть быстрее, чем And, потому что он не оценивает последующие условия, если более раннее условие оказывается ложным.

And - это возврат к более ранним версиям Visual Basic.
Большинство (я стесняюсь сказать все) современных языков используют логические операторы, которые подвергают условиям короткого замыкания, которые не нужно строго оценивать.

например. && Операторы and для языков стиля C работают как AndAlso.

Будьте осторожны, если у вас много кода, который использует And и Or, глобальный поиск и замена могут изменить существующее поведение, если второе условие включает вызов функции, который имеет побочные эффекты.

Я бы предпочел использовать AndAlso и OrElse, если вам не требуется особая функциональность, предоставляемая And & Or

4 голосов
/ 15 июля 2011

Происходя из фона C и C ++ в VB (изначально V5), всегда раздражало, что and и or в VB не закорачиваются. Поэтому случай, когда второе выражение зависело от первого, всегда сложнее было написать.

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

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

3 голосов
/ 12 июня 2012

Когда условия также являются функциями:

If functionA() And functionB() Then

...

public shared functionA() As Boolean
  IF A is false THEN log -> return true or false

...

public shared functionB() As Boolean
  IF B is false THEN log -> return true or false

Использование AndAlso здесь может быть неправильным путем, потому что тогда он будет регистрировать только B, когда A и B ложны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...