Оценка заявления IF в VB.NET - PullRequest
8 голосов
/ 02 февраля 2009

Для следующих операторов If в VB.NET, какова будет последовательность, в которой будут оцениваться условия?

Случай 1:

If ( condition1 AND condition2 AND condition3 )
.
.
End If

Дело 2:

If ( condition1 OR condition2 OR condition3 )
.
.
End If

Дело 3:

If ( condition1 OR condition2 AND condition3  OR condition4)
.
.
End If

Ответы [ 3 ]

11 голосов
/ 02 февраля 2009

VB.Net оценивает все условия, поэтому порядок здесь не важен.

Если вы хотите использовать короткое замыкание, используйте ключевые слова AndAlso и OrElse.

9 голосов
/ 02 февраля 2009

VB.NET - очень странный зверь с точки зрения программиста на C. Как упоминал Джерри в другом ответе, все три условия оцениваются полностью без короткого замыкания. AndAlso и OrElse могут сохранить ваш день, если вы этого хотите.

Что касается последнего , если , порядок оценки следующий:

If ((condition1 OR (condition2 AND condition3))  OR condition4)

Как правило: если есть любая неоднозначность, используйте скобки, чтобы явно указать порядок оценки.

1 голос
/ 17 декабря 2013

Это не совсем ответ на рассматриваемый вопрос, так как на него уже был дан ответ, я почувствовал необходимость расширить ключевое слово «OrElse», упомянутое Антоном, а также его относительное: «AndAlso», потому что кто-то приземляется на самом деле этот вопрос мне нужен для объяснения.

'OrElse' и 'AndAlso' Полезно, если вам требуется явно упорядоченная оценка.

В отличие от 'Or' и 'And', где все выражения оцениваются, оператор If может пропустить оставшиеся выражения, если первое выражение оценивается до желаемого значения, когда вы используете 'OrElse' или 'AndAlso'.

В следующем случае порядок выражений применим к 'OrElse' слева направо, но также не всегда оценивает все выражения в зависимости от результата предыдущего значения:

if( Expression1 orelse Expression2 orelse Expression3 )

    ' Code...

End If

Если Expression1 равен true, то выражения 2 и 3 игнорируются. Если Expression1, если False, то Expression2 оценивается, а затем Expression3, если Expression2 оценивается как True.

If (False OrElse True OrElse False ) then
    ' Expression 1 and 2 are evaluated, Expression 3 is ignored.
End If

If (True OrElse True OrElse True ) then
    ' only Expression 1 is evaluated.
End If

If (True OrElse True OrElse True ) then
    ' only Expression 1 is evaluated.
End If

If (False OrElse False OrElse True ) then
    ' All three expressions are evaluated
End If

Альтернативный пример использования 'OrElse':

If( (Object1 is Nothing) OrElse (Object2 is Nothing) OrElse (Object3 is Nothing) ) then 


    ' At least one of the 3 objects is not null, but we dont know which one.
    ' It is possible that all three objects evaluated to null.
    ' If the first object is null, the remaining objects are not evaluated.
    ' if Object1 is not  NULL and Object2 is null then Object3 is not evaluated

Else

   ' None of the objects evaluated to null.

Endif

Приведенный выше пример аналогичен следующему:

If(Object1 Is Nothing)

    ' Object 1 is Nothing
    Return True

Else 
    If(Object2 Is Nothing)
        ' Object 2 is Nothing 
        Return True
    Else
        If(Object3 Is Nothing)
            ' Object 3 is Nothing 
            Return True
        Else
            ' One of the objects evaluate to null
            Return False
        End If    
    End If      
End If 

Существует также ключевое слово AndALso :

' If the first expression evaluates to false, the remaining two expressions are ignored
If( Expression1 AndAlso Expression2 AndAlso Expression3 ) Then ...

Что можно использовать так:

If( (Not MyObject is Nothing) AndAlso MyObject.Enabled ) Then ...

   ' The above will not evaluate the 'MyObject.Enabled' if 'MyObject is null (Nothing)'
   ' MyObject.Enabled will ONLY be evaluated if MyObject is not Null.

   ' If we are here, the object is NOT null, and it's Enabled property evaluated to true

Else

  ' If we are here, it is because either the object is null, or it's enabled property evaluated to false;

End If 

В отличие от «И», как и «Ор», всегда будут оцениваться все выражения:

If( (Not MyObject is Nothing) And MyObject.Enabled ) Then ...

   ' MyObject.Enabled will ALWAYS be evaluated, even if MyObject is NULL,
   ' ---  which will cause an Exception to be thrown if MyObject is Null.

End If 

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

Следующее вызовет исключение, если 'MyObject' равен NUll

Try 
    If( MyObject.Enabled  AndAlso (Not MyObject is Nothing) ) Then ...

       ' This means that first expression MyObject.Enabled Was evaluated  to True, 
       ' Second Expression also Evaluated to True

    Else

       ' This means MyObject.Enabled evaluated to False, thus also meaning the object is not null.
       ' Second Expression "Not MyObject is Nothing" was not evaluated.

    End If 
Catch(e as Exception)

    ' An exception was caused because we attempted to evaluate MyObject.Enabled while MyObject is Nothing, before evaluating Null check against the object.

End Try

Пожалуйста, прокомментируйте, если я допустил ошибку или опечатку здесь, поскольку я написал это в 5:16 утра после 2 дней без сна.

...