在VB.NET中,And
和AndAlso
之间有什么区别?我应该使用哪种?
答案 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中的And
和Or
是位运算符,而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
也是一位操作员。
||
和&&
(OrElse
和AndAlso
的C#版本)返回最后一次评估的表达式3
和5
分别。这使得您可以使用C#中的惯用语v || 5
在5
为v
或(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
答案 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会检查下一个,因此不会出现错误。