VB.NET中的And和AndAlso有什么区别?

在VB。在NET中,AndAndAlso之间有什么区别?我应该用哪一种?

172567 次浏览

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。

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

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(),即使它是nothing,这将抛出异常。

AndAlso很像And,只不过它的工作方式和&&c#, c++等等。

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

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

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

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

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

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

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

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

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

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




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

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

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

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

有趣的是,没有一个答案提到VB中的AndOr。NET是位操作符,而OrElseAndAlso是严格的布尔操作符。

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

请注意:非零整数被认为是true;Dim e = not 0将把e设置为-1,这表明Not也是位操作符。

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

为了回答这个问题:使用OrAnd进行比特操作(整数或布尔)。使用OrElseAndAlso“短路”操作以节省时间,或在计算之前测试计算的有效性。If valid(evaluation) andalso evaluation thenif not (unsafe(evaluation) orelse (not evaluation)) then

奖金:下面的值是什么?

Dim e = Not 0 And 3

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

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

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

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

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

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

需要说明OrElse用于如果语句:

If x > 3 AndAlso x <= 5 Then

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

在我看来…

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

If x = (y And 3) 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,它将崩溃,因为在AndAB等于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处停止求值,因为返回的是FalseAndAlso阻止了条件的任何进一步求值(因为第一个条件失败了)。OrElse的工作方式相同。逻辑链中求值的第一个True将停止任何进一步求值。