在VB.NET中,And和之间有什么区别AndAlso?我应该使用哪个?
在VB.NET中,And和之间有什么区别AndAlso?我应该使用哪个?
Answers:
该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/
Then是它自己的关键字。
该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,我认为合法的理由很少,而且相差甚远。当然,大多数其他语言在默认情况下会短路是有原因的:它保留了结果的含义,同时在不做任何贡献的情况下不评估可能代价高昂的表达式。在某些情况下隐匿副作用应该是有目的的。但这只是我的意见...
有趣的是没有一个答案提到,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 || 5C#中的惯用法5将vis 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
||和&&用??。虽然有些语言||会返回非假值,但C#并不是其中一种,并且返回a bool(提升的可为空的运算符除外,在这里您会得到Nullable<bool>结果)
If Bool1 And Bool2 Then
评估Bool1和Bool2
If Bool1 AndAlso Bool2 Then
仅当Bool1为true时才评估Bool2。
另请参阅堆栈溢出问题:是否应该始终使用AndAlso和OrElse运算符?。
另外:对那些使用And表达式右侧是否具有副作用的人的注释:
如果右侧有副作用,只需将其移至左侧即可,而不要使用“ And”。你只有真正需要“和”如果双方互有副作用。如果发生了很多副作用,则可能是在做其他错误。通常,您确实应该更喜欢AndAlso。
除上述答案外,AndAlso还提供一种称为短路的调节过程。许多编程语言都像vb.net一样内置了此功能,并且可以通过消除不必要的评估来在长条件语句中显着提高性能。
另一个类似的条件是OrElse条件,该条件仅在左侧条件为假时才检查右侧条件,因此在找到真实条件后便会删除不必要的条件检查。
我建议您始终使用短路流程并以可以从中受益最大的方式来构造条件语句。例如,首先测试最有效和最快的条件,以便仅在绝对需要时运行长期条件,而在其他时间将其短路。