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

Nak*_*ary 240 vb.net short-circuiting

在VB.NET中,And和之间有什么区别AndAlso?我应该使用哪个?

Nic*_*ico 369

And运算符计算两侧,其中AndAlso评估右侧当且仅当左侧是真实的.

一个例子:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If
Run Code Online (Sandbox Code Playgroud)

以上如果抛出异常 mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If
Run Code Online (Sandbox Code Playgroud)

这个不会抛出异常.

因此,如果您来自C#世界,您应该AndAlso像使用它一样使用&&.

更多信息:http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

  • 有人知道为什么他们没有选择"AndThen"吗?我认为这会更直观. (12认同)
  • 我一直以为这是违反直觉的.并且也意味着它将检查两者,这应该是相反的方式!因此,为什么我必须来SO来检查这样的事情(是的,我是ac#guy).你也应该永远不必问一个像"And And AndAlso"这样的问题.太多了!我的英语老师会杀了我 (7认同)
  • 无论何时我使用OrElse,我总会想到南方公园"或者其他什么?" "究竟" (3认同)
  • “更多信息”链接已损坏。这是新网址:http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/ (2认同)

Ed *_*rty 29

And运营商将检查所有条件的声明,然后再继续,而如果它知道条件是假的Andalso操作将停止.例如:

if x = 5 And y = 7
Run Code Online (Sandbox Code Playgroud)

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

if x = 5 AndAlso y = 7
Run Code Online (Sandbox Code Playgroud)

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

通常人们使用短路方法如果有理由在第一部分不正确时明确不检查第二部分,例如如果检查则会抛出异常.例如:

If Not Object Is Nothing AndAlso Object.Load()
Run Code Online (Sandbox Code Playgroud)

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

  • 如果右侧有您需要的副作用,只需将其移到左侧而不是使用"和".如果_both_双方都有副作用,你只需要"和".如果你有很多副作用,你可能会做错其他的事情. (14认同)
  • 首先,Andalso 主要不是用于“运行时节省”,这是荒谬的。其次,让第二个参数执行一些有用的“副作用”是一种丑陋的坏习惯。 (2认同)
  • 你不能争辩说它不会"节省运行时间".而且我发现其中有副作用的情况,而不是丑陋的不良做法. (2认同)

小智 19

有趣的是没有一个答案提到,AndOr在VB.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
Run Code Online (Sandbox Code Playgroud)

注意:考虑非零整数true; Dim e = not 0将设置e-1演示Not也是一点运算符.

||&&(C#版本的OrElseAndAlso)返回最后一个评估的表达式,它将分别35.这使得您可以使用v || 5C#中的惯用语5作为vis null或(0和整数)时的表达式值以及v其他值.语义上的差异可以让一个C#程序员在VB.NET中躲避,因为这个"默认值成语"在VB.NET中不起作用.

所以,回答这个问题:使用OrAnd用于位操作(整数或布尔值).使用OrElseAndAlso"短路"操作以节省时间,或在评估之前测试评估的有效性.If valid(evaluation) andalso evaluation then要么if not (unsafe(evaluation) orelse (not evaluation)) then

额外奖励:以下价值是多少?

Dim e = Not 0 And 3
Run Code Online (Sandbox Code Playgroud)


Bry*_*son 14

If Bool1 And Bool2 Then
Run Code Online (Sandbox Code Playgroud)

评估Bool1和Bool2

If Bool1 AndAlso Bool2 Then
Run Code Online (Sandbox Code Playgroud)

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


Ian*_*Ian 13

只是对于所有那些说副作用是邪恶的人:在一个条件下有两个副作用的地方是好的将是串联读取两个文件对象.

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While
Run Code Online (Sandbox Code Playgroud)

使用And确保每次检查条件时都会消耗一行.虽然AndAlso可能会读取最后一行File1并且File2没有消耗线就离开.

当然上面的代码不起作用,但是我一直使用这样的副作用,并且不会将它视为" "或" 邪恶 "代码,因为有些会让你相信.它易于阅读和高效.


Tor*_*gen 5

AndAlso非常类似于And,除了它在C#,C ++等中与&&类似。

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

有时这非常有用,例如在诸如以下的表达式中:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*orn 5

另请参阅堆栈溢出问题:是否应该始终使用AndAlso和OrElse运算符?

另外:对那些使用And表达式右侧是否具有副作用的人的注释:

如果右侧需要副作用,只需将其移到左侧即可,而不要使用“ And”。你只有真正需要“和”如果双方互有副作用。如果发生了很多副作用,则可能是在做其他错误。通常,您确实应该更喜欢AndAlso。


小智 5

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

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


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
Run Code Online (Sandbox Code Playgroud)

  • 英语比代码更容易混淆,因为它没有规范! (3认同)