And
在 VB.NET 中,和有什么区别AndAlso
?我应该使用哪个?
12 回答
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# 版本)分别返回最后计算的表达式,即和。这使您可以使用 C# 中的习语来给出表达式的值 when is or (和一个整数),否则给出值。语义上的差异可能会让涉足 VB.NET 的 C# 程序员措手不及,因为这种“默认值习语”在 VB.NET 中不起作用。OrElse
AndAlso
3
5
v || 5
5
v
null
0
v
因此,要回答这个问题:使用Or
andAnd
进行位运算(整数或布尔值)。使用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。
另请参阅 Stack Overflow 问题:我应该始终使用 AndAlso 和 OrElse 运算符吗?.
另外:对于那些提到使用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
除了上述答案之外,AndAlso 还提供了一种称为短路的调节过程。许多编程语言都像 vb.net 一样内置了此功能,并且可以通过删除不必要的评估来显着提高长条件语句的性能。
另一个类似的条件是 OrElse 条件,它仅在左条件为假时检查右条件,从而在找到真条件后切断不必要的条件检查。
我建议您始终使用短路过程并以最能从中受益的方式构建您的条件语句。例如,首先测试您最有效和最快的条件,以便您仅在绝对必须时运行长时间条件并在其他时间短路。
对于我们大多数人来说,OrElse 和 AndAlso 可以解决问题,除了一些令人困惑的异常(不到 1% 的情况我们可能不得不使用 Or 和 And)。
尽量不要被人们炫耀他们的布尔逻辑并让它看起来像一门火箭科学而得意忘形。
它非常简单直接,有时您的系统可能无法按预期工作,因为它首先不喜欢您的逻辑。然而,你的大脑不断告诉你,他的逻辑经过了 100% 的测试和验证,并且应该有效。在那一刻停止相信你的大脑,让他再想一想,或者(不是 OrElse 或 OrElse)你强迫自己寻找另一份不需要太多逻辑的工作。
用文字而不是鳕鱼来理解:
用例:
使用“And”,编译器将检查所有条件,因此如果您检查一个对象可能是“Nothing”,然后您检查它的一个属性,您将遇到运行时错误。
但是如果 AndAlso 在条件中使用第一个“false”,它将检查下一个,因此您不会出现错误。
使用And和Or进行逻辑位运算,例如x% = y% Or 3
AndAlso和OrElse用于If语句:
If x > 3 AndAlso x <= 5 Then
和
If (x > 3) And (x <= 5) Then
我怎么看...
另外值得注意的是,(我)建议您在If语句中将带有逻辑运算符的方程括起来,这样它们就不会被编译器误解,例如:
If x = (y And 3) AndAlso ...