Подтвердить что ты не робот

Что лучше для производительности? И против AndAlso

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

If 1=1 And 2=2 Then

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

If Not IsDbNull(Value) AndAlso Value=2 Then

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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 являются ложными.