以前見過AndAlso,但一直都沒有放在心上,也沒有查資料看看它們之間到底是什麼關係。
今天一看,才發現使用它們的效果是不一樣的,原以爲And 就和C++中的 && 一個樣子(都是短路的),沒想到And不短路,而AndAlso纔是短路的。看來以後是該用AndAlso的就用AndAlso,該用And的就用And 。
e.g.
Dim i As Int32
Dim s() As String
i = 0
If i = 1 AndAlso s(1) = "1" Then
MessageBox.Show("不可能到這裏")
Else
MessageBox.Show("AndAlso可以短路啊")
End If
If i = 1 And s(1) = "1" Then '錯誤 其他信息: 未將對象引用設置到對象的實例。
MessageBox.Show("不可能到這裏")
Else
MessageBox.Show("也不可能到這裏")
End If
OrElse類似
以下是MSDN上的說明:
短路運算符
邏輯運算符 AndAlso 和 OrElse 表現稱爲“短路”的行爲。短路運算符首先計算左側表達式。如果左側表達式使整個表達式爲假(在 AndAlso 中)或驗證(在 OrElse 中)整個表達式,則程序執行過程繼續,而不計算右側表達式。請見下面的示例:
If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,運算符計算左側表達式 45 < 12。因爲此表達式計算爲 False,所以整個邏輯表達式計算爲 False。程序執行過程因此開始執行 If 塊內的代碼,而不計算右側表達式 MyFunction(3)
。在此示例中,永遠不調用 MyFunction(),因爲左側表達式使整個表達式爲假。
同樣,如果使用 OrElse 的邏輯表達式中左側表達式計算爲 True,則執行過程繼續下一行代碼,而不計算第二個表達式,因爲第一個表達式已經啓用整個表達式。
相反,當使用邏輯運算符 And 和 Or 時,邏輯運算符的兩側都要計算。例如,請考慮下面的表達式:
If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,對 MyFunction() 進行調用,即使第一個表達式計算爲 False。
AndAlso 運算符
對兩個表達式執行簡化邏輯合取。
備註
如果編譯的代碼可以根據一個表達式的計算結果跳過對另一表達式的計算,則將該邏輯運算稱爲“短路”。如果第一個表達式的計算結果可以決定運算的最終結果,則不需要計算另一個表達式,因爲它不會更改最終結果。如果跳過的表達式很複雜或涉及過程調用,則短路可以提高性能。
示例
本示例使用 AndAlso 運算符對兩個表達式執行邏輯合取。結果是一個 Boolean 值,它表示整個聯合表達式是否爲真。如果第一個表達式爲 False,則不計算第二個表達式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B AndAlso B > C ' True.
myCheck = B > A AndAlso B > C ' False. Second expression not evaluated.
myCheck = A > B AndAlso C > B ' False. Second expression evaluated.
Public Function FindValue(ByVal Arr() As Double, _
ByVal SearchValue As Double) As Double
Dim I As Integer = 0
While I <= UBound(Arr) AndAlso Arr(I) <> SearchValue
' If I is greater than UBound(Arr), SearchValue is not checked.
I += 1
End While
If I >= UBound(Arr) Then I = –1
Return I
End Function
OrElse 運算符
用於對兩個表達式執行短路邏輯析取。
備註
如果編譯的代碼可以根據一個表達式的計算結果跳過對另一表達式的計算,則將該邏輯運算稱爲“短路”。如果第一個表達式的計算結果可以決定運算的最終結果,則不需要計算另一個表達式,因爲它不會更改最終結果。如果跳過的表達式很複雜或涉及過程調用,則短路可以提高性能。
示例
本例使用 OrElse 運算符對兩個表達式執行邏輯析取。結果是一個 Boolean 值,它表示兩個表達式中是否有一個爲真。如果第一個表達式爲 True,則不計算第二個表達式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B OrElse B > C ' True. Second expression is not evaluated.
myCheck = B > A OrElse B > C ' True. Second expression is evaluated.
myCheck = B > A OrElse C > B ' False.
If MyFunction(5) = True OrElse MyOtherFunction(4) = True Then
' If MyFunction(5) is True, MyOtherFunction(4) is not called.
' Insert code to be executed.
End If
下面來看看And 和 Or
And 運算符
對兩個 Boolean 表達式執行邏輯合取,或對兩個數值表達式執行按位合取。
注意 由於邏輯/位運算符的優先級低於其他算術和關係運算符的優先級,所以應該將任何按位運算括在括號中以確保準確執行。如果操作數包括一個 Boolean 表達式和一個數值表達式,則結果 Boolean 表達式將轉換爲數值(-1 表示 True,0 表示 False),最終將進行按位運算。
Or 運算符
用於對兩個 Boolean 表達式執行邏輯析取,或對兩個數值執行按位析取。
注意 由於邏輯/位運算符的優先級低於其他算術和關係運算符的優先級,所以應該將任何按位運算括在括號中以確保準確執行。如果操作數包括一個 Boolean 表達式和一個數值表達式,則結果 Boolean 表達式將轉換爲數值(-1 表示 True,0 表示 False),最終將進行按位運算。