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


当前回答

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将停止任何进一步求值。

其他回答

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

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 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将停止任何进一步求值。

And操作符将在继续执行之前检查语句中的所有条件,而Andalso操作符将在知道条件为false时停止。例如:

if x = 5 And y = 7

检查x是否等于5,y是否等于7,如果两者都为真,则继续。

if x = 5 AndAlso y = 7

检查x是否等于5。如果不是,它不会检查y是否为7,因为它知道条件已经为假。(这叫做短路。)

通常人们使用短路方法,如果有理由显式地不检查第二部分,如果第一部分不为真,比如如果检查它会抛出异常。例如:

If Not Object Is Nothing AndAlso Object.Load()

如果使用And而不是AndAlso,它仍然会尝试Object.Load(),即使它什么都不是,这将抛出异常。

AndAlso很像And,除了它像c#和c++中的&&一样工作。

区别在于,如果第一个子句(AndAlso之前的子句)为真,那么第二个子句永远不会被求值——复合逻辑表达式是“短路的”。

这有时是非常有用的,例如在这样的表达式中:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

如果myObj为null,则在上面的表达式中使用旧的And将抛出NullReferenceException。

使用And和Or进行逻辑位操作,例如x% = y%或3

AndAlso和OrElse是If语句:

如果x > 3 AndAlso x <= 5那么

If (x > 3) And (x <= 5) Then

在我看来…

同样值得注意的是,(我)建议你在If语句中包含逻辑运算符的方程,这样它们就不会被编译器误解,例如:

If x = (y And 3) And also…