在VB。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/

If Bool1 And Bool2 Then

同时计算Bool1和Bool2

If Bool1 AndAlso Bool2 Then

当且仅当Bool1为真时计算Bool2。

除了上面的答案,AndAlso还提供了一个称为短路的调节过程。许多编程语言都像vb.net一样内置了这种功能,并且可以通过删除不必要的计算来大幅提高长条件语句的性能。

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

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

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

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

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

理解:用语言而不是用密码来理解:

用例:使用“And”,编译器将检查所有条件,所以如果你检查一个对象可能是“Nothing”,然后你检查它的一个属性,你将会有一个运行时错误。 但是对于AndAlso,如果条件中第一个“false”,它会检查下一个,这样就不会出现错误。