在VB.NET中,And
和之间有什么区别AndAlso
?我应该使用哪个?
该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/
该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
,这将抛出异常.
有趣的是没有一个答案提到,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
注意:考虑非零整数true
; Dim e = not 0
将设置e
为-1
演示Not
也是一点运算符.
||
和&&
(C#版本的OrElse
和AndAlso
)返回最后一个评估的表达式,它将分别3
和5
.这使得您可以使用v || 5
C#中的惯用语5
作为v
is 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
If Bool1 And Bool2 Then
评估Bool1和Bool2
If Bool1 AndAlso Bool2 Then
当且仅当Bool1为真时才评估Bool2.
只是对于所有那些说副作用是邪恶的人:在一个条件下有两个副作用的地方是好的将是串联读取两个文件对象.
While File1.Seek_Next_Row() And File2.Seek_Next_Row() Str1 = File1.GetRow() Str2 = File2.GetRow() End While
使用And
确保每次检查条件时都会消耗一行.虽然AndAlso
可能会读取最后一行File1
并且File2
没有消耗线就离开.
当然上面的代码不起作用,但是我一直使用这样的副作用,并且不会将它视为" 坏 "或" 邪恶 "代码,因为有些会让你相信.它易于阅读和高效.
AndAlso非常类似于And,除了它在C#,C ++等中与&&类似。
区别在于,如果第一个子句(AndAlso之前的那个)为真,则第二个子句将永远不会求值-复合逻辑表达式为“短路”。
有时这非常有用,例如在诸如以下的表达式中:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then ... End If
如果myObj为null,则在上面的表达式中使用旧的And将抛出NullReferenceException。
另请参阅堆栈溢出问题:是否应该始终使用AndAlso和OrElse运算符?。
另外:对那些使用And
表达式右侧是否具有副作用的人的注释:
如果右侧需要副作用,只需将其移到左侧即可,而不要使用“ 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