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

时间:2011-12-07 01:53:26

标签: vb.net syntax operators

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

4 个答案:

答案 0 :(得分:66)

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

OrElse/AndAlsoshort-circuiting。只有在单独评估左表达不能确定结果时,才评估正确的表达。 (这意味着:OrElse只会在左表达式为false时评估正确的表达式,而AndAlso只在左表达式为真时才评估正确的表达式。)

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

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

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

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

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

就我个人而言,我发现AndAlsoOrElse正确的运算符,除了1%或更少之外,所有人都可以使用它们! - 需要副作用

的情况。

快乐的编码。


1 第一个表达式中抛出的异常将阻止第二个表达式的计算,但这应该不会令人感到意外。

答案 1 :(得分:10)

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

答案 2 :(得分:4)

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

Or正常(评估两个条件)的例子:

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

评估它们的方式并不重要

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

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then

这允许第一个条件来检查对象是否已被设置,并且只有在已经设置的情况下才会检查数据库(或其他任务)。如果这是一个简单的And关键字,则会对它们进行评估。

答案 3 :(得分:2)

@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