2012-12-08 3 views
3

Можно создать дубликат:
Should I always use the AndAlso and OrElse operators?почему AndAlso не замена и

В практической реализации всех сценариев, логическое выражение будет возвращать то же логическое значение, как для And и AndAlso,

Почему мы не используем всегда AndAlso и сохраняем время обработки для следующего условия когда предыдущее значение false? Другими словами, почему And все еще используется?

+0

, так как 99,99% использования должно быть 'AndAlso', почему бы не' AndAlso' становиться 'And', а' And' становится другим ключевым словом? – Alaa

ответ

5

Оператор И в VB.NET выполняет два задания, он является логическим и математическим оператором. Ранние версии Visual Basic не отличались между ними. По дизайну, язык был разработан, чтобы быть простым в использовании и заставляя программистов на Visual Basic изучать разницу, чего хотели избежать разработчики языка.

Это работало довольно хорошо, хотя это дало языку несколько причуд. Значение True, например, не равно 1, как и на многих языках, оно равно -1. Значение, которое вы получаете от CInt (True). Который позволяет игнорировать разницу между двумя операциями оператора, он по-прежнему хорошо работает, когда оператор If() использует И, когда левая сторона является целым, а правая сторона - логическая, например.

Но есть довольно специфическая проблема с оператором And, играющим обе роли. Общее применение, чтобы написать такое заявление:

If ix < array.Length And array(ix) <> 42 Then 
    '' do something 
End If 

Это заявление, которое сделает ваш код аварии с IndexOutOfRangeException. То, что вы указали , является «если индекс за пределами границ, то не мешайте проверке элемента массива». Это называется «оценка короткого замыкания». Но это не то, что делает оператор И, он оценивает как левое, так и правильное выражения. Как и оператор математический, оператор And должен сделать.

Оценка короткого замыкания важна и длится довольно долго. И повсеместно принято на языках фигурной скобки, начиная с С. И, наконец, получили принято в VB.NET, а также, вы пишете это так, чтобы избежать исключения:

If ix < array.Length AndAlso array(ix) <> 42 Then 
    '' do something 
End If 

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

+0

Не 'AndAlso' медленнее, чем' AND' как логический оператор? Это должно быть добавление логики 'If ... Then' и' GoTo' за кулисами. – Neolisk

+1

@Neolisk: В общем, предположим, что 'AndAlso' быстрее *, чем' And' - представьте себе: 'If AliensExist() и WaitForAliens() Then ...' - это будет блокироваться до тех пор, пока не придут инопланетяне, даже если инопланетяне не будут существовать. С AndAlso он не будет блокировать, если инопланетяне не существуют. –

+0

@ RolfBjarneKvinge: как насчет 'If a = 5 AndAlso b = 7' vs' Если a = 5 И b = 7'? – Neolisk

1

Иногда вы хотите, чтобы обе части были выполнены, для побочных эффектов. Не все - чистая функция. Кроме того: я предполагаю, что мы говорим о булевых, но в случае целых чисел и т. Д. И означает побитовое ОП.

+0

Спасибо за ваш ответ, можете ли вы привести пример использования 'And' в целых числах, когда' AndAlso' недействителен в качестве замены, – Alaa

+0

@Ala как в: 5 И 3 ===> 1 –

+1

Когда VB.Net впервые появился они сделали отдельные побитовые операторы, называемые BitAnd и BitOr, но затем изменили его так, чтобы операторы And и Or выполняли побитовые операции и добавляли AndAlso и OrElse для короткого замыкания. –

Смежные вопросы