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


当前回答

对于我们大多数人来说,除了少数令人困惑的例外(不到1%的情况下,我们可能不得不使用Or和and), OrElse和AndAlso可以做到这一点。

尽量不要被那些炫耀布尔逻辑的人带着走,让它看起来像火箭科学。

这是非常简单和直接的,偶尔你的系统可能不会像预期的那样工作,因为它首先不喜欢你的逻辑。然而,你的大脑一直告诉你,他的逻辑是100%经过测试和证明的,它应该是有效的。在那一刻,不要再相信你的大脑,让他重新思考,或者(不是OrElse,也可能是OrElse)你强迫自己去找另一份不需要太多逻辑的工作。

其他回答

对于我们大多数人来说,除了少数令人困惑的例外(不到1%的情况下,我们可能不得不使用Or和and), OrElse和AndAlso可以做到这一点。

尽量不要被那些炫耀布尔逻辑的人带着走,让它看起来像火箭科学。

这是非常简单和直接的,偶尔你的系统可能不会像预期的那样工作,因为它首先不喜欢你的逻辑。然而,你的大脑一直告诉你,他的逻辑是100%经过测试和证明的,它应该是有效的。在那一刻,不要再相信你的大脑,让他重新思考,或者(不是OrElse,也可能是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还提供了一个称为短路的调节过程。许多编程语言都像vb.net一样内置了这种功能,并且可以通过删除不必要的计算来大幅提高长条件语句的性能。

另一个类似的条件是OrElse条件,它只在左侧条件为假的情况下检查右侧条件,从而在发现真条件后省去不必要的条件检查。

我会建议你总是使用短路过程,并以最能从中受益的方式组织你的条件语句。例如,首先测试最有效和最快的条件,这样您只在绝对必须时运行长条件,而在其他时间运行短路。

有趣的是,没有一个答案提到VB中的And和Or。NET是位操作符,而OrElse和AndAlso是严格的布尔操作符。

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

注意:非零整数被认为是真;Dim e = not 0将把e设为-1,说明not也是位运算符。

||和&& (OrElse和AndAlso的c#版本)返回最后求值的表达式,分别为3和5。这让你可以使用c#中的习语v || 5,当v为null或(0和一个整数)时,将5作为表达式的值,否则将v的值作为表达式的值。语义上的差异可以让c#程序员接触VB。NET猝不及防,因为这个“默认值习语”在VB.NET中不起作用。

因此,要回答这个问题:对于位操作(整数或布尔)使用或和。使用OrElse和AndAlso来“短路”操作以节省时间,或者在评估之前测试评估的有效性。如果是有效的(评估),那么也是评估;如果不是(不安全的(评估),或者其他(不是评估)),那么

附赠:以下内容的价值是什么?

Dim e = Not 0 And 3

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

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


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