在 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 bResult As Boolean
' And とAndAlso が 異なる
' 會發生錯誤,因為 oArray 為 Nothing,不能直接使用它的 Count 屬性
bResult = ( Not oArray Is Nothing ) And (oArray.Count > 0 )
' 不會發生錯誤,因為第一個判斷式為 False 即傳回 False,後序的判斷式不評估
bResult = ( Not oArray Is Nothing ) AndAlso (oArray.Count > 0 )
上面的程式碼中,若使用 And 運算子會發生錯誤,因為 (oArray IsNot Nothing) 及 (oArray.Count > 0) 二個判斷式會同時被評估,而這樣的程式碼很容易發生錯誤;因為一但 oArray 為 Nothing 時,後面的 (oArray.Count = 0) 一定會發生錯誤。上述使用 And 運算子的判斷式,要修正如下才是正確的。
但使用 AndAlso 運算子就沒有這個困擾了,因為當 (oArray IsNot Nothing) 為 False 時,它就會馬上傳回 False,後面的 (oArray.Count > 0) 根本不會被評估;因為後面的判斷式為 True 或 False 都不會影響結果,所以 AndAlso 可以執行最少運算邏輯交集運算,當然執行效能上相對好。