(OrElse和Or)和(AndAlso和And) - 何时使用?

aer*_*aer 44 vb.net syntax operators

(OrElse和Or)和(AndAlso和And)有什么区别?他们的表现有什么不同,让我们说正确的好处?有什么情况我不会使用OrElse和AndAlso吗?

小智 67

Or/And始终评估双方1个表达式,然后返回结果.它们不是短路的.

OrElse/AndAlso短路的.只有在单独评估左表达不能确定结果时,才评估正确的表达.(这意味着:OrElse如果左表达式为false,AndAlso则仅评估正确的表达式;如果左表达式为真,则仅评估正确的表达式.)

假设表达式中没有副作用,并且表达式不依赖(并且忽略任何执行开销),那么它们是相同的.

但是,在许多情况下,表达式依赖的.例如,当List不是-Nothing并且有多个元素时,我们想要做一些事情:

If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff
Run Code Online (Sandbox Code Playgroud)

这也可用于避免"昂贵"的计算(或副作用,ick!):

If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid
Run Code Online (Sandbox Code Playgroud)

就个人而言,我发现AndAlso并且OrElse正确的运算符,除了1%之外,或者更少,希望!- 需要副作用的情况.

快乐的编码.


1第一个表达式中抛出的异常将阻止第二个表达式的计算,但这应该不会令人惊讶.


Gid*_*rth 10

除了在其他答案中提到的短路之外,Or/ And可用作位运算符,其中OrElse/ AndAlso不是.按位运算包括组合Flags枚举的值,例如FileAttributes枚举,您可以指示文件既是只读的又是隐藏的FileAttributes.ReadOnly Or FileAttributes.Hidden