Or/And将始终评估双方1个表达式,然后返回结果。它们不是短路的。OrElse/AndAlso是短路。仅当无法仅通过对左表达式的评估无法确定结果时,才对右表达式进行评估。(这意味着:OrElse仅当左表达式为false AndAlso时才评估右表达式,并且仅当左表达式为true时才评估右表达式。)假设表达式中没有副作用,并且表达式不相关(并且忽略了任何执行开销),则它们是相同的。但是,在许多情况下,表达式是从属的。例如,当列表不是-Nothing且具有多个元素时,我们想做一些事情:If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff这也可以用来避免“昂贵”的计算(或副作用,!):If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid就个人而言,我发现,AndAlso和OrElse是正确的运营商都使用,但在1% -或更小,有希望!- 需要副作用的情况。快乐的编码。1在第一个表达式中引发异常将阻止对第二个表达式进行求值,但这并不奇怪。
除了其他答案中提到的短路外,Or/ And还可用作OrElse/ AndAlso而不是/的按位运算符。按位操作包括组合Flags枚举的值,例如FileAttributes枚举,在该枚举中您可能表示文件是只读的,并且被隐藏FileAttributes.ReadOnly Or FileAttributes.Hidden
区别在于OrElse和AndAlso将基于第一个条件发生短路,这意味着如果不通过第一个条件,则将不评估第二个(或更多个)条件。当其中一个条件可能比另一个条件更为密集时,这特别有用。哪里Or很好的示例(同时评估了两个条件):If Name = "Fred" Or Name = "Sam" Then评估它们的方式真的无关紧要以下AndAlso是有用的,因为第二个条件可能会失败If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then这使第一个条件可以检查是否已设置对象,并且只有在设置了对象之后,才可以检查数据库(或其他任务)。如果这是一个普通And关键字,则将对两个关键字都进行评估。