AndAlso和OrElse應該是vb。net引入的新運算符。
因為用vb。net的時間還不是很長,之前我一直以為他們和and,or根本沒有區別。
現在終於明白,他們之間還是有很大區別的:
AndAlso,OrElse相對於and,or最大的特性是會自動實現“最短路徑”。
所謂“最短路徑”就是指:當第一個被比較的運算式的結果已經能決定運算的最終結果時,就不會再去比較其他運算式,因此可以避免掉額外且不需要的比較運算式。
舉個很簡單的例子說明下:
Dim a As Int16 = 1 Dim b As Int16 = 2 ' 用or的話,a=1,b=2都會被比較 If a = 1 Or b = 2 Then ' xxxxx End If ' 用OrElse的話,只比較了第一個條件a=1 If a = 1 OrElse b = 2 Then ' xxxx End If
當用or的時候,a=1和b=2這2個條件,都會被判斷。而用orelse,則當前面一個條件(a=1)已經能決定最終結果的話,程序就不會在判斷第二個條件(b=2)了。
類似的情況還有:
Dim a As Int16 = 1 Dim b As Int16 = 2 ' 用and的話,a=999,b=2,(a + b) * (b - a) = 3 都會被比較 If a = 999 And b = 2 And (a + b) * (b - a) = 3 Then ' xxxxx End If ' 用AndAlso的話,只比較了第一個條件a=999,由於已經是false了,所以后面的運算式不再判斷 If a = 999 AndAlso b = 2 AndAlso (a + b) * (b - a) = 3 Then ' xxxx End If
當出現以上情況時,AndAlso和OrElse的效率要高於and,or。
所以,在大多數情況下,我們可以使用AndAlso和OrElse替換and,or,以提高運算效率。
EF生成的SQL語句對比:
OrElse會生成OR
exec sp_executesql N'SELECT [b].[RowID], [b].[BusinessCode], [b].[BusinessDescription], [b].[IsActive], [b].[CreateUserName], [b].[CreateTime], [b].[UpdateUserName], [b].[UpdateTime] FROM [base_Business] AS [b] WHERE ([b].[BusinessCode] LIKE ''%01'') OR ([b].[BusinessCode] LIKE ''B%'') ORDER BY [b].[BusinessCode] OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=100
如果用Or,生成的語句為:
exec sp_executesql N'SELECT [b].[RowID], [b].[BusinessCode], [b].[BusinessDescription], [b].[IsActive], [b].[CreateUserName], [b].[CreateTime], [b].[UpdateUserName], [b].[UpdateTime] FROM [base_Business] AS [b] WHERE (CASE WHEN [b].[BusinessCode] LIKE ''%01'' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END | CASE WHEN [b].[BusinessCode] LIKE ''B%'' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END) = CAST(1 AS bit) ORDER BY [b].[BusinessCode] OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=100