在 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 结合运算子。
Dim oArray As ArrayList ’未使用 New 建立物件执行个体
Dim bResult As Boolean
’会发生错误,因为 oArray 为 Nothing,不能直接使用它的 Count 属性
bResult = (oArray Is Nothing) Or (oArray.Count = 0)
’不会发生错误,因为第一个判断式为 True 即传回 True,后序的判断式不评估
bResult = (oArray Is Nothing) OrElse (oArray.Count = 0)
上面的程式码中,若使用 Or 运算子会发生错误,因为 (oArray Is Nothing) 及 (oArray.Count = 0) 二个判断式会同时被评估,而这样的程式码很容易发生错误;因为一但 oArray 为 Nothing 时,后面的 (oArray.Count = 0) 一定会发生错误。上述使用 Or 运算子的判断式,要修正如下才是正确的。
bResult = True
Else
bResult = (oArray.Count = 0)
End If
但使用 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 结合运算子。
Dim oArray As ArrayList ’未使用 New 建立物件执行个体
Dim bResult As Boolean
’会发生错误,因为 oArray 为 Nothing,不能直接使用它的 Count 属性
bResult = (oArray IsNot Nothing) And (oArray.Count > 0)
’不会发生错误,因为第一个判断式为 True 即传回 True,后序的判断式不评估
bResult = (oArray IsNot Nothing) AndAlso (oArray.Count > 0)
上面的程式码中,若使用 And 运算子会发生错误,因为 (oArray IsNot Nothing) 及 (oArray.Count > 0) 二个判断式会同时被评估,而这样的程式码很容易发生错误;因为一但 oArray 为 Nothing 时,后面的 (oArray.Count = 0) 一定会发生错误。上述使用 And 运算子的判断式,要修正如下才是正确的。
If oArray IsNot Nothing Then
bResult = True
Else
bResult = (oArray.Count > 0)
End If
但使用 AndAlso 运算子就没有这个困扰了,因为当 (oArray IsNot Nothing) 为 False 时,它就会马上传回 False,后面的 (oArray.Count > 0) 根本不会被评估;因为后面的判断式为 True 或 False 都不会影响结果,所以 AndAlso 可以执行最少运算逻辑交集运算,当然执行效能上相对好。