VB.NET中的And和AndAlso有什么区别?
在VB.NET中, And
和AndAlso
什么AndAlso
? 我应该用哪个?
And
运算符评估双方,当且仅当左侧为真时, AndAlso
评估右侧。
一个例子:
If mystring IsNot Nothing And mystring.Contains("Foo") Then ' bla bla End If
如果mystring = Nothing
,上面会引发exception
If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then ' bla bla End If
这个不会抛出exception。
所以如果你来自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,因为它知道条件已经是假的。 (这叫做短路。)
通常人们使用短路的方法,如果第二部分是不真实的,如果有明显的不检查第二部分的理由,如果检查时会抛出exception。 例如:
If Not Object Is Nothing AndAlso Object.Load()
如果使用了And
不是AndAlso
,它仍然会尝试Object.Load()
即使它nothing
,这会抛出一个exception。
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
可以读取AndAlso
的最后一行,并保留File2
而不消耗行。
当然上面的代码是行不通的,但是我总是用这样的副作用,不会把它看成是“ 坏 ”或者“ 邪恶 ”的代码,因为有些代码会让你相信。 这很容易阅读和高效。
有趣的是没有一个答案提到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
也是一个位操作符。
||
和&&
( OrElse
和AndAlso
的C#版本)返回最后一个评估expression式,分别为3
和5
。 这让你使用成语v || 5
v || 5
在C#中,当v
为null
或( 0
和一个整数)时给出5
作为expression式的值,否则给出v
的值。 在VB.NET中,语义上的差异可以捕捉到一个涉及VB.NET的C#程序员,因为这个“默认值成语”在VB.NET中不起作用。
所以,要回答这个问题 :使用Or
和And
进行位运算(整型或布尔型)。 使用OrElse
和AndAlso
可以“缩短”操作以节省时间,或在评估之前testing评估的有效性。 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 If [both are true] Then If Bool1 AndAlso Bool2 Then If [first is true then evaluate the second] Then
而且,除了像C#,C ++等中的&&外,它也很像
不同之处在于,如果第一个子句(AndAlso前面的那个)为真,则第二个子句从不计算 – 复合逻辑expression式是“短路的”。
这有时是非常有用的,例如在一个expression式中:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then ... End If
在上面的expression式中使用旧的如果myObj为null,则会抛出一个NullReferenceExceptionexception。
另请参阅堆栈溢出问题: 我是否应始终使用AndAlso和OrElse运算符? 。
另外:对那些提及使用的评论如果expression的右侧有副作用,你需要:
如果右侧有副作用,只需将其移动到左侧,而不是使用“和”。 如果双方都有副作用,你只需要“和”。 如果你有这么多的副作用,你可能会做一些其他的错误。 一般来说,你应该更喜欢AndAlso。
除了上面的答案之外,And还提供了一种称为短路的调节过程。 许多编程语言都像vb.net一样内置了这个function,并且可以通过删除不必要的评估来在长条件语句中提供显着的性能提升。
另一个类似的条件是OrElse条件,如果左边的条件是错误的,它将只检查正确的条件,从而在find真实的条件后,删除不必要的条件检查。
我build议你总是使用短路过程,并以最能受益的方式来构build你的条件语句。 例如,首先testing一下你最有效和最快的条件,这样当你绝对必要时,你只能运行你的长期条件,而在其他时候短路。
对于我们大多数人来说,OrElse和AndAlso都会这样做,除了一些令人困惑的例外(less于1%的地方我们可能需要使用Or和And)。
尽量不要被那些炫耀自己的逻辑逻辑的人所感染,让它看起来像火箭科学。
这很简单直接,偶尔你的系统可能无法按预期工作,因为它不喜欢你的逻辑。 然而,你的大脑不停地告诉你,他的逻辑是100%testing和certificate,它应该工作。 在此刻,不要再相信自己的大脑,要求他再想一想,或者(而不是OrElse或OrElse)强迫自己去寻找另一个不需要太多逻辑的工作。