在VB。And和AndAlso的区别是什么?我应该用哪一种?


当前回答

And运算符求两边的值,而AndAlso运算符求右边的值当且仅当左边为真。

一个例子:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

如果mystring = Nothing,则会抛出异常

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

这个不抛出异常。

所以如果你来自c#世界,你应该像使用&&一样使用AndAlso。

更多信息请访问:http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

其他回答

And / AndAlso Or / OrElse实际上非常有用。考虑下面的代码,如果函数DoSomethingWihtAandB返回False,它可能不会设置A和/或B:

Dim A,B,C,D As Object
If DoSomethingWithAandB(A,B)=True And A=1 And B=2 Then C=3

如果DoSomethingWithAandB返回False,它将崩溃,因为它将在And之后继续计算,A和B将等于Nothing

Dim A,B,C,D As Object
If DoSomethingWithAandB(A,B)=True AndAlso A=1 AndAlso B=2 Then C=3

如果DoSomethingWithAandB返回False,它不会崩溃,因为它将在DoSomethingWithAandB(A,B)=True时停止求值,因为返回的是False。AndAlso阻止对条件进行任何进一步的计算(因为第一个条件失败了)。OrElse的工作原理与此相同。逻辑链中求值的第一个True将停止任何进一步求值。

另见堆栈溢出问题:我应该总是使用AndAlso和OrElse操作符吗?

另外:对那些提到使用And的人的评论,如果表达式的右侧有副作用,你需要:

如果右侧有你需要的副作用,只需将其移到左侧,而不是使用“And”。只有在双方都有副作用的情况下你才需要"并且"如果你有那么多的副作用你可能做错了其他事情。一般来说,你应该更喜欢AndAlso。

一种简单的思考方法是使用更简单的英语

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

And运算符求两边的值,而AndAlso运算符求右边的值当且仅当左边为真。

一个例子:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

如果mystring = Nothing,则会抛出异常

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

这个不抛出异常。

所以如果你来自c#世界,你应该像使用&&一样使用AndAlso。

更多信息请访问:http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

对于所有那些说副作用是邪恶的人来说:在一种情况下有两个副作用是好的,那就是同时读取两个文件对象。

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

使用And可以确保每次检查条件时都使用一行。而AndAlso可能会读取File1的最后一行,而不消耗File2的行。

当然,上面的代码不会起作用,但我一直在使用这样的副作用,不会像有些人让你相信的那样,认为它是“坏”或“邪恶”的代码。它易于阅读和高效。