在VB.NET中评估IF语句

时间:2009-02-02 08:32:08

标签: vb.net evaluation if-statement

对于VB.NET中的以下If语句,将评估条件的顺序是什么?

案例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 个答案:

答案 0 :(得分:11)

VB.Net会评估所有条件,因此这里的顺序并不重要。

如果您想使用短路,请使用AndAlso和OrElse关键字。

答案 1 :(得分:9)

从C程序员的角度来看,VB.NET是一个非常奇怪的野兽。正如Gerrie在一个不同的答案中提到的那样,所有三个条件都是完全评估的,没有短路。如果这就是你想要的,那么Also和OrElse可以节省你的一天。

对于最后的 if ,评估顺序如下:

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

根据经验:如果任何 ambiguitiy,请使用括号明确指定评估顺序。

答案 2 :(得分:1)

这并不能完全回答手头的问题,因为它已经得到了解答,我觉得有必要扩展Anton提到的'OrElse'关键字以及它的相对关系:'AndAlso',因为有人登陆这个问题我实际上想要解释这些。

'OrElse'和'AndAlso'如果您需要明确订购的评估,则非常有用。

与'Or'和'And'不同,如果所有表达式都被计算,当您使用'OrElse'或'AndAlso'时,如果第一个表达式求值为所需值,则If语句可以跳过剩余的表达式。

在下面的例子中,表达式的顺序从左到右适用于'OrElse',但也不总是根据前面值的结果计算所有表达式:

if( Expression1 orelse Expression2 orelse Expression3 )

    ' Code...

End If

如果Expression1为true,则忽略表达式2和3。 如果Expression1为False,则表示Expression2,然后表达式3,如果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 

与'And'不同,像'Or'一样会始终评估所有表达式:

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'产生影响,所以应首先评估对象为null的天气,如上例所示。

如果'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点睡觉后写了这个。