邏輯運算符
邏輯運算符允許將表達式結合起來這些運算符如表所示
除了Not之外的其他運算符都需要兩個表達式其格式如下所示
表的結果更加明顯
AndAls和OrElse運算符與And和Or有相同的結果但是存在細微的差別使用普通版本兩個表達式(左側和右側)都要進行計算但是使用簡化運算符時沒有這個必要如果其中一個表達式可以保證結果則可以停止計算表達式例如考慮以下代碼
dim Name As String=Dave
If Name=Dave Or Name=Dan Then
name is either Dave or Dan
End If
在這個示例中要檢查Name是否為Dave然後還要檢查Name是否為Dan現在考慮以下代碼
If Name=Dave OrElse Name= Dan Then
這裡首先檢查Name是否為Dave如果是則不需要執行第二個表達式(檢查Name是否為Dan)因為這不會影響結果在許多情況下使用何種形式(普通形式或簡化形式)無關緊要但有時候也有關系例如想像如果不是簡單地檢查名字而是調用一個函數來更新數據庫在使用普通形式時數據庫將會更新但簡化版本不調用該函數因而數據庫不會被更新使用標准的And運算符代碼如下所示
If UserIsInRole(Admin) And UserAudit(Admin) Then
user is an admin and their details have been updated
End If
即使當前用戶不在Admin角色中該語句也會調用UserAudit函數因為使用And意味著要完成測試的兩個部分要解決這個問題可以使用以下語句
If UserIsInRole(Admin) AndAlso UserAudit(Admin) Then
user is an admin and their details have been updated
End If
現在只有當用戶處於Admin角色時才會調用UserAudit使用·AndAlso意味著如果檢查的第一部分失敗則不會計算第二部分因此不會運行UserAudit
在另一種情況下簡化形式也會有用當您需要了解某個對象的屬性是否存在一個值時您只要檢查該對象是否存在而不是檢查它是否被設置為Noting例如考慮以下代碼其中的數據是從數據庫獲取的然後只有在返回一些行時才需要執行某個操作
Dim rdr As SqlDataReader
rdr=DataLayerGetProducts()
If rdr IsNot Nothing And rdrHasRows Then
假定由於某個原因數據庫訪問失敗而且rdr被設置為空值即Nothing使用And的普通形式時兩個表達式都會被檢查首先完成Nothing的檢查該檢查返回False因為rdr為Nothing接下來完成第二個檢查檢查Boolean變量HasRows的屬性看看是否返回一些數據但是rdr是Nothing因此會產生異常為了解決這個問題可以使用And的簡化形式
If rdr IsNot Nothing AndAlso rdrHasRows Then
現在不會產生任何異常完成第一個檢查後由於結果為False因此不進行第二個檢查也沒有這種必要因為第一個檢查為False之後整個表達式不可能為True
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/net/201311/14752.html