Короткое замыкание: OrElse в сочетании с Or - PullRequest
5 голосов
/ 09 сентября 2010

Если у меня есть следующее ...

a OrElse b 

... и a равно True , тогда ясно, что b никогда не оценивается. Но если я добавлю Or, то что?

a OrElse b Or c

Должны ли / должны ли оцениваться? А что если я поставлю несколько скобок?

Извинения, если это является основным. Конечно, я могу проверить ответ сам, но я не могу найти ответ на этот вопрос здесь или в другом месте. Много вопросов, касающихся или против OrElse , но ничего не связано с или с OrElse

Ответы [ 4 ]

5 голосов
/ 09 сентября 2010

Или используйте короткие замыкания между левым и правым боковыми параметрами (только 2 параметра).Поэтому я бы сказал, что C всегда будет оцениваться, поскольку вы можете рассматривать это как (A OrElse B) Or C.

MSDN OrElse

3 голосов
/ 09 сентября 2010

Это проблема приоритета оператора.Соответствующая документация находится здесь:
http://msdn.microsoft.com/en-us/library/fw84t893.aspx?ppud=4

Важные выдержки:

  • Операторы с равным приоритетом оцениваются слева направо в порядке их появленияВ выраженииздесь мы узнаем, что Or и OrElse имеют одинаковый приоритет и что операторы с одинаковым приоритетом вычисляются слева направо.

    Следовательно, я ожидаю, что в случаях, когда a истинно, bне оценивается.Тем не менее, c все еще будет.В случаях, когда a ложно, оценивается b и независимо от значения b оператор Or будет оценивать c.Так что, да, c всегда оценивается.

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

3 голосов
/ 09 сентября 2010

В представленном случае оценивается c.Небольшой тест скажет вам:

Debug.WriteLine(test(1) OrElse test(2) Or test(3))

Function test(ByVal a As Integer) As Boolean

    Debug.WriteLine(a)
    Return True

End Function

Вышеприведенный пример выводит:

1
3
True
0 голосов
/ 09 сентября 2010

По моему личному опыту, VB стремится получить значение для всех из них, независимо от того, были ли они фактически оценены или нет.

Это полезно только тогда, когда порядок имеет значение для наличия предметов и тому подобного. Просто хотел это отметить.

...