在VB。And和AndAlso的区别是什么?我应该用哪一种?


当前回答

理解:用语言而不是用密码来理解:

用例:使用“And”,编译器将检查所有条件,所以如果你检查一个对象可能是“Nothing”,然后你检查它的一个属性,你将会有一个运行时错误。 但是对于AndAlso,如果条件中第一个“false”,它会检查下一个,这样就不会出现错误。

其他回答

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

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


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

And操作符将在继续执行之前检查语句中的所有条件,而Andalso操作符将在知道条件为false时停止。例如:

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(),即使它什么都不是,这将抛出异常。

对于所有那些说副作用是邪恶的人来说:在一种情况下有两个副作用是好的,那就是同时读取两个文件对象。

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

使用And可以确保每次检查条件时都使用一行。而AndAlso可能会读取File1的最后一行,而不消耗File2的行。

当然,上面的代码不会起作用,但我一直在使用这样的副作用,不会像有些人让你相信的那样,认为它是“坏”或“邪恶”的代码。它易于阅读和高效。

If Bool1 And Bool2 Then

同时计算Bool1和Bool2

If Bool1 AndAlso Bool2 Then

当且仅当Bool1为真时计算Bool2。

AndAlso很像And,除了它像c#和c++中的&&一样工作。

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

这有时是非常有用的,例如在这样的表达式中:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

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