(OrElse and Or) and (AndAlso and And) - 啥时候使用?

Posted

技术标签:

【中文标题】(OrElse and Or) and (AndAlso and And) - 啥时候使用?【英文标题】:(OrElse and Or) and (AndAlso and And) - When to use?(OrElse and Or) and (AndAlso and And) - 什么时候使用? 【发布时间】:2012-01-14 14:51:30 【问题描述】:

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

【问题讨论】:

Should I always use the AndAlso and OrElse operators? 的可能重复项 刚开始使用 VB.NET(VB 多年来第一次)。我上网只是为了问这个特定的问题。感谢@aer 和许多用他们的好答案澄清的人。 【参考方案1】:

Or/And总是评估 both1 表达式,然后返回结果。它们没有短路。

OrElse/AndAlso 是short-circuiting。仅当无法仅从左表达式的求值中确定结果时,才求值右表达式。 (这意味着:OrElse 只会在左表达式为假时计算右表达式,而AndAlso 只会在左表达式为真时计算右表达式。)

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

然而,在许多情况下,表达式依赖的。例如,当一个 List 不是空的并且有多个元素时,我们想做一些事情:

If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff

这也可以用来避免“昂贵”的计算(或副作用,糟糕!):

If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid

就我个人而言,我发现AndAlsoOrElse正确 运算符,除了1% 或更少,希望如此! - 需要副作用的情况。

编码愉快。


1 在第一个表达式中抛出的异常将阻止对第二个表达式进行求值,但这应该不足为奇..

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

不同之处在于 OrElse 和 AndAlso 将根据第一个条件短路,这意味着如果第一个条件不通过,则不会评估第二个(或更多)条件。当其中一个条件可能比另一个条件更密集时,这尤其有用。

Or 很好的示例(两个条件均已评估):

If Name = "Fred" Or Name = "Sam" Then

他们被评估的方式并不重要

以下AndAlso 很有用,因为第二个条件可能会失败

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then

这允许第一个条件检查对象是否已设置,并且仅当已设置对象时才会检查数据库(或其他一些任务)。如果这是一个普通的 And 关键字,则两者都会被评估。

【讨论】:

【参考方案4】:

@Gideon - 很高兴有人指出了这一点。下面是一个简单的测试,显示了 AndAlso 的巨大影响:

    Dim tm As New Stopwatch
    Const tries As Integer = 123456
    Dim z As Integer = 0
    Dim s() As String = New String() "0", "one"

    Debug.WriteLine("AndAlso")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next

    Debug.WriteLine("And")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next

【讨论】:

以上是关于(OrElse and Or) and (AndAlso and And) - 啥时候使用?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 AND 和 OR 关键字

Codeforces 551 D. GukiZ and Binary Operations

布尔运算符 && 和 ||

and和or的用法和区别

英语中一般疑问句or和and的区别

条件查询中的多or和and条件结合