关 键 词:
在 vb.net 中,一般的判断式都会使用到 Or 及 And 运算子,可是比较少人知道它们还有二个相对应的 OrElse 及 AndAlso 运算子。一般而言,笔者会建议所有的判断式都使用OrElse 来取代 Or 运算子,使用 AndAlso 来取代 And 运算子。为什么呢?因为 OrElse 及 AndAlso 运算子的执行效能会优于 Or 及 And 运算子,以下就来说明其中的原由。
OrElse 运算子
意义:对两个运算式执行最少运算 (Short-Circuiting) 内含逻辑分离 (Logical Disjunction)。
result = expression1 OrElse expression2
使用 OrElse 运算子来结合多个判断式时,它会由前至后逐一评估每个判断式的结果,当判断过程中有其中一个判断式为 True 时,它就会略过后序的判断式,直接传回 True。也就是当 expression1的评估结果为 True 时,expression2 就不会再去评估结果,当 OrElse 结合的判断式愈多时,更会突显出它的执行效能优势。
我们来看看下面的程式码,同样的判断式分别使用 Or 及 OrElse 结合运算子。
DimoArrayAsArrayList’未使用New建立物件执行个体
DimbResultAsBoolean
’会发生错误,因为oArray为Nothing,不能直接使用它的Count属性
bResult=(oArrayIsNothing)Or(oArray.Count=0)
’不会发生错误,因为第一个判断式为True即传回True,后序的判断式不评估
bResult=(oArrayIsNothing)OrElse(oArray.Count=0)
上面的程式码中,若使用 Or 运算子会发生错误,因为(oArray Is Nothing) 及 (oArray.Count = 0) 二个判断式会同时被评估,而这样的程式码很容易发生错误;因为一但 oArray 为 Nothing 时,后面的 (oArray.Count= 0)一定会发生错误。上述使用 Or 运算子的判断式,要修正如下才是正确的。
bResult=True
Else
bResult=(oArray.Count=0)
EndIf
但使用 OrElse 运算子就没有这个困扰了,因为当 (oArray Is Nothing) 为 True 时,它就会马上传回 True,后面的 (oArray.Count = 0)根本不会被评估;因为后面的判断式为 True 或 False 都不会影响结果,所以 OrElse 会对两个运算式执行最少运算,当然执行效能上相对好。
AndAlso 运算子
意义:对两个运算式执行最少运算逻辑交集运算。
result = expression1 AndAlso expression2
使用 AndAlso 运算子来结合多个判断式时,它会由前至后逐一评估每个判断式的结果,当判断过程中有其中一个判断式为 False 时,它就会略过后序的判断式,直接传回 False。也就是当 expression1的评估结果为 False 时,expression2 就不会再去评估结果,当 AndAlso 结合的判断式愈多时,更会突显出它的执行效能优势。
我们来看看下面的程式码,同样的判断式分别使用 And 及 AndAlso 结合运算子。
DimoArrayAsArrayList’未使用New建立物件执行个体
DimbResultAsBoolean
’会发生错误,因为oArray为Nothing,不能直接使用它的Count属性
bResult=(oArrayIsNotNothing)And(oArray.Count>0)
’不会发生错误,因为第一个判断式为True即传回True,后序的判断式不评估
bResult=(oArrayIsNotNothing)AndAlso(oArray.Count>0)
IfoArrayIsNotNothingThen
bResult=True
Else
bResult=(oArray.Count>0)
EndIf
但使用 AndAlso 运算子就没有这个困扰了,因为当 (oArray IsNot Nothing) 为 False 时,它就会马上传回 False,后面的 (oArray.Count> 0) 根本不会被评估;因为后面的判断式为 True 或 False 都不会影响结果,所以 AndAlso 可以执行最少运算逻辑交集运算,当然执行效能上相对好。