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

时间:2008-11-19 14:36:45

标签: vb.net short-circuiting

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

11 个答案:

答案 0 :(得分:358)

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/

答案 1 :(得分:28)

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,也会引发异常。

答案 2 :(得分:14)

有趣的是,没有一个答案提到VB.NET中的AndOr是位运算符,而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 || 55v或(null和整数)时将0作为表达式的值,并且否则为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

答案 3 :(得分:13)

If Bool1 And Bool2 Then

评估Bool1和Bool2

If Bool1 AndAlso Bool2 Then

当且仅当Bool1为真时才评估Bool2。

答案 4 :(得分:12)

对于所有那些认为副作用是邪恶的人:在一个条件下有两个副作用的地方是好的,就是串联读取两个文件对象。

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

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

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

答案 5 :(得分:4)

AndAso很像And,除了它的作品和&&在C#,C ++等中

不同之处在于,如果第一个子句(AndAlso之前的子句)为真,则永远不会评估第二个子句 - 复合逻辑表达式是“短路”。

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

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

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

答案 6 :(得分:4)

另请参阅Stack Overflow问题: Should I always use the AndAlso and OrElse operators?

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

如果右侧有副作用,只需将其移到左侧而不是使用“和”。如果两个方都有副作用,你只需要“和”。如果你有很多副作用,你可能会做错其他的事情。一般来说,你真的应该更喜欢AndAlso。

答案 7 :(得分:4)

考虑它的一个简单方法是使用更简洁的英语

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


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

答案 8 :(得分:2)

除上述答案外,AndAlso还提供称为短路的调节过程。许多编程语言都像vb.net一样内置了这个功能,并且通过删除不必要的评估,可以在长条件语句中提供显着的性能提升。

另一个类似的条件是OrElse条件,它只检查左条件为假的正确条件,从而在找到真条件后删除不必要的条件检查。

我建议你总是使用短路过程,并以最能从中受益的方式构建条件语句。例如,首先测试您最有效和最快速的条件,这样您就可以在必要时运行长时间条件并在其他时间短路。

答案 9 :(得分:0)

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

尽量不要让人们炫耀他们的布尔逻辑,让它看起来像火箭科学。

这非常简单直接,偶尔您的系统可能无法正常工作,因为它首先不喜欢您的逻辑。然而,你的大脑一直在告诉你他的逻辑是100%经过测试和验证的,它应该可行。在那一刻,停止相信你的大脑并让他再次思考,或者(不是OrElse或OrElse)你强迫自己寻找另一份不需要太多逻辑的工作。

答案 10 :(得分:0)

要用非鳕鱼一词来理解:

用例:
使用“ And”,编译器将检查所有条件,因此,如果您检查某个对象可能为“ Nothing”,然后再检查其属性之一,则将出现运行时错误。
但是在条件为第一个为“ false”的情况下,AndAlso会检查下一个,因此不会出现错误。