短路:OrElse与Or结合使用

时间:2010-09-09 14:45:46

标签: vb.net operator-precedence short-circuiting

如果我有以下内容......

a OrElse b 

...而a是 True 然后显然b永远不会被评估。但是,如果我添加Or,那么呢?

a OrElse b Or c

是否应该评估?如果我放入一些括号怎么办?

如果这是基本的道歉。当然我可以自己测试答案,但我无法在这里或其他地方找到这个问题的答案。很多问题涉及 OrElse ,但没有涉及 OrElse

4 个答案:

答案 0 :(得分:5)

左侧和右侧参数之间的OrElse短路(仅2个参数)。因此,我会说C始终会被评估,因为您可以将其视为(A OrElse B) Or C

MSDN OrElse

答案 1 :(得分:3)

在提供的案例中,评估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

答案 2 :(得分:3)

这是运营商优先级问题。相关文件如下:
http://msdn.microsoft.com/en-us/library/fw84t893.aspx?ppud=4

重要的摘录:

  
      
  • 具有相同优先级的运算符按照它们在表达式中出现的顺序从左到右进行计算。
  •   

  

包容性分离( Or,OrElse

所以我们在这里学到的是Or和OrElse具有相同的优先级,并且从左到右评估具有相同优先级的运算符。

因此,我希望在a为真的情况下,b不会被评估。但是,c仍然是。如果a为false,则会评估b,并且无论b的值如何,Or运算符都会评估c。所以,是的,c总是被评估。

实际上,除非您有充分的理由使用OrElse,否则您通常应该在代码中使用OrOr现在主要用于向后兼容。

答案 3 :(得分:-1)

根据我的个人经验,VB倾向于获得所有这些的价值,无论它们是否真的被评估过。

这仅在订单对物品存在等问题时有用。只想注意它。