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/
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,这将抛出异常.
小智 19
有趣的是没有一个答案提到,And并Or在VB.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
Run Code Online (Sandbox Code Playgroud)
注意:考虑非零整数true; Dim e = not 0将设置e为-1演示Not也是一点运算符.
||和&&(C#版本的OrElse和AndAlso)返回最后一个评估的表达式,它将分别3和5.这使得您可以使用v || 5C#中的惯用语5作为vis null或(0和整数)时的表达式值以及v其他值.语义上的差异可以让一个C#程序员在VB.NET中躲避,因为这个"默认值成语"在VB.NET中不起作用.
所以,回答这个问题:使用Or和And用于位操作(整数或布尔值).使用OrElse和AndAlso"短路"操作以节省时间,或在评估之前测试评估的有效性.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没有消耗线就离开.
当然上面的代码不起作用,但是我一直使用这样的副作用,并且不会将它视为" 坏 "或" 邪恶 "代码,因为有些会让你相信.它易于阅读和高效.
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。
另请参阅堆栈溢出问题:是否应该始终使用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)