VB.NET 布林值(Boolean) 筆記(核心篇)
Boolean 是用來表示邏輯結果的型別,只有 True 與 False 兩種值。只要需求是在判斷是否成立、是否允許、是否勾選、是否完成,就常會用到布林值。
Boolean 的重點不是只會存放 True 或 False,而是讓條件流程變清楚。好的布林變數名稱會像一句判斷問題,例如 isReady、canSubmit、hasPermission,閱讀時就能直接看懂判斷意義。
先理解 Boolean 在做什麼
Boolean 表示條件是否成立
Boolean 適合保存「是或否」的結果。它通常不是最終畫面文字,而是程式用來決定下一步流程的依據。
- 狀態:是否啟用、是否完成、是否鎖定。
- 條件:分數是否達標、輸入是否有效、權限是否足夠。
- 控制流程:搭配
If、Else決定執行哪一段程式。 - 組合判斷:使用
AndAlso、OrElse、Not組合多個條件。
Boolean 適合用在只有兩種結果的情境。 若狀態其實有三種以上,例如「未開始、處理中、完成、失敗」,就不適合硬塞成多個 Boolean,通常應改用 Enum 表示狀態。
基本宣告
Dim isReady As Boolean = True
Dim hasWarning As Boolean = False
Dim canSubmit As Boolean = isReady AndAlso Not hasWarning
基本使用:True 與 False
場景一:展場入口核驗
這個範例用展場入口核驗示範 Boolean。只有手環有效,而且尚未離場,才允許進入展區。
需要的主控項
CheckBoxBandValid:手環是否有效。CheckBoxAlreadyLeft:是否已離場。ButtonCheckEntry:檢查入場資格。LabelEntryResult:顯示核驗結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckEntry_Click(sender As Object, e As EventArgs) Handles ButtonCheckEntry.Click
Dim bandValid As Boolean = CheckBoxBandValid.Checked
Dim alreadyLeft As Boolean = CheckBoxAlreadyLeft.Checked
Dim canEnter As Boolean = bandValid AndAlso Not alreadyLeft
If canEnter Then
LabelEntryResult.Text = "核驗結果:可以入場"
Else
LabelEntryResult.Text = "核驗結果:不可入場"
End If
End Sub
End Class
邏輯解析
CheckBox.Checked本身就是 Boolean。bandValid表示手環是否有效。Not alreadyLeft表示尚未離場。canEnter把入場條件整理成一個清楚的布林結果。
布林運算子
| 運算子 | 意思 | 適合情境 |
|---|---|---|
| AndAlso | 兩個條件都成立才成立。 | 帳號有效且密碼正確。 |
| OrElse | 其中一個條件成立就成立。 | 有票券或有邀請碼。 |
| Not | 反轉布林結果。 | 不是鎖定狀態、不是空白。 |
| Xor | 兩邊不同才成立。 | 兩個選項只能選其中一個。 |
場景二:會議室開放條件
這個範例示範 AndAlso、OrElse 與 Not。會議室要開放,必須已完成清潔,而且不能維修中;若有預約或屬於開放時段,就可以提出使用申請。
需要的主控項
CheckBoxCleaned:是否已清潔。CheckBoxMaintenance:是否維修中。CheckBoxReserved:是否已有預約。CheckBoxOpenHour:是否為開放時段。ButtonCheckRoom:檢查會議室。LabelRoomResult:顯示結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckRoom_Click(sender As Object, e As EventArgs) Handles ButtonCheckRoom.Click
Dim cleaned As Boolean = CheckBoxCleaned.Checked
Dim maintenance As Boolean = CheckBoxMaintenance.Checked
Dim reserved As Boolean = CheckBoxReserved.Checked
Dim openHour As Boolean = CheckBoxOpenHour.Checked
Dim roomAvailable As Boolean = cleaned AndAlso Not maintenance
Dim requestAllowed As Boolean = reserved OrElse openHour
If roomAvailable AndAlso requestAllowed Then
LabelRoomResult.Text = "會議室狀態:可使用"
Else
LabelRoomResult.Text = "會議室狀態:暫不可使用"
End If
End Sub
End Class
邏輯解析
cleaned AndAlso Not maintenance表示已清潔且沒有維修。reserved OrElse openHour表示已有預約或目前是開放時段。- 先把複雜條件拆成有名稱的布林變數,會比把所有條件塞進同一個
If更容易理解。
AndAlso 與 OrElse 的短路判斷
短路判斷:AndAlso 與 OrElse 會在結果已經確定時停止往後檢查。這不只是效能問題,也能避免後面的判斷在資料不合法時發生錯誤。
場景三:優惠碼輸入檢查
這個範例先確認優惠碼不是空白,再檢查長度。若沒有先判斷空白,就直接處理後續規則,程式可讀性會變差。
需要的主控項
TextBoxCoupon:輸入優惠碼。ButtonCheckCoupon:檢查優惠碼。LabelCouponResult:顯示結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckCoupon_Click(sender As Object, e As EventArgs) Handles ButtonCheckCoupon.Click
Dim couponText As String = TextBoxCoupon.Text.Trim()
Dim hasCoupon As Boolean = couponText <> String.Empty
Dim formatValid As Boolean = hasCoupon AndAlso couponText.Length = 8
If formatValid Then
LabelCouponResult.Text = "優惠碼格式正確"
Else
LabelCouponResult.Text = "優惠碼需為 8 碼"
End If
End Sub
End Class
邏輯解析
hasCoupon先表示是否有輸入內容。AndAlso左邊若為False,右邊就不需要繼續判斷。- 條件拆開命名後,判斷目的會比直接寫一大串更清楚。
If 判斷與 Boolean
場景四:設備巡檢是否通過
Boolean 最常和 If 搭配使用。這個範例用三個檢查項目組成巡檢結果,全部通過才顯示可啟用。
需要的主控項
CheckBoxPower:電源正常。CheckBoxNetwork:網路正常。CheckBoxSensor:感測器正常。ButtonCheckDevice:檢查設備。LabelDeviceResult:顯示巡檢結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckDevice_Click(sender As Object, e As EventArgs) Handles ButtonCheckDevice.Click
Dim powerOk As Boolean = CheckBoxPower.Checked
Dim networkOk As Boolean = CheckBoxNetwork.Checked
Dim sensorOk As Boolean = CheckBoxSensor.Checked
Dim inspectionPassed As Boolean = powerOk AndAlso networkOk AndAlso sensorOk
If inspectionPassed Then
LabelDeviceResult.Text = "巡檢結果:通過,可啟用"
Else
LabelDeviceResult.Text = "巡檢結果:未通過,請重新確認"
End If
End Sub
End Class
邏輯解析
- 每個勾選項目都是一個 Boolean。
inspectionPassed將所有巡檢條件整理成一個結果。If inspectionPassed Then讀起來就像直接判斷「巡檢是否通過」。
Boolean.TryParse:文字轉布林
場景五:讀取設定文字
若布林值來自輸入框、設定檔或外部資料,通常會先是文字。使用 Boolean.TryParse 可安全轉換 True 或 False,轉換失敗時不會中斷程式。
需要的主控項
TextBoxSetting:輸入設定值,例如true。ButtonReadSetting:讀取設定。LabelSettingResult:顯示轉換結果。
範例程式碼
Public Class Form1
Private Sub ButtonReadSetting_Click(sender As Object, e As EventArgs) Handles ButtonReadSetting.Click
Dim sourceText As String = TextBoxSetting.Text.Trim()
Dim autoSaveEnabled As Boolean
If Boolean.TryParse(sourceText, autoSaveEnabled) Then
If autoSaveEnabled Then
LabelSettingResult.Text = "自動儲存:已啟用"
Else
LabelSettingResult.Text = "自動儲存:已停用"
End If
Else
LabelSettingResult.Text = "設定值必須是 True 或 False"
End If
End Sub
End Class
邏輯解析
Boolean.TryParse成功時會回傳True,並把結果放入autoSaveEnabled。- 輸入
true或false可以成功轉換,不分大小寫。 - 若外部資料可能不合法,
TryParse比Parse更適合。
Xor:只能成立其中一邊
場景六:通知方式二選一
Xor 表示兩邊不同時才成立。這個範例要求「簡訊」與「Email」只能選一個,不能都不選,也不能兩個都選。
需要的主控項
CheckBoxSms:簡訊通知。CheckBoxEmail:Email 通知。ButtonCheckNotify:檢查通知方式。LabelNotifyResult:顯示結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckNotify_Click(sender As Object, e As EventArgs) Handles ButtonCheckNotify.Click
Dim useSms As Boolean = CheckBoxSms.Checked
Dim useEmail As Boolean = CheckBoxEmail.Checked
Dim onlyOneSelected As Boolean = useSms Xor useEmail
If onlyOneSelected Then
LabelNotifyResult.Text = "通知方式設定完成"
Else
LabelNotifyResult.Text = "請只選擇一種通知方式"
End If
End Sub
End Class
邏輯解析
Xor在兩邊不同時回傳True。- 只勾選簡訊或只勾選 Email,都會通過。
- 兩個都勾選或兩個都不勾選,都會失敗。
實務判斷與常見誤區
常見問題整理
- 用 0 / 1 代替 Boolean:程式會失去語意,閱讀時不容易看出判斷目的。
- 布林變數命名不清楚:
flag1、check這類名稱不容易理解。 - 條件全部塞進 If:複雜條件可以先拆成
canSubmit、isValid等變數。 - 用多個 Boolean 表示流程狀態:狀態超過兩種時,通常應使用
Enum。 - 外部文字直接 Parse:輸入可能不合法,建議使用
Boolean.TryParse。
| 需求 | 適合 Boolean | 不適合 Boolean |
|---|---|---|
| 是否完成 | 完成 / 未完成。 | 未開始 / 進行中 / 完成 / 失敗。 |
| 是否允許 | 可入場 / 不可入場。 | 一般票 / 工作證 / 貴賓證 / 臨時證。 |
| 是否勾選 | CheckBox 是否勾選。 | 多個分類選項與權限組合,可能更適合 Flags Enum。 |
重點整理
Boolean只有True與False兩種值。- Boolean 適合表示是否成立、是否允許、是否啟用、是否完成。
AndAlso表示兩個條件都要成立。OrElse表示其中一個條件成立即可。Not會反轉布林結果。Xor適合判斷兩個條件是否只有其中一個成立。Boolean.TryParse適合把外部文字安全轉成布林值。- 狀態超過兩種時,不宜硬用 Boolean,通常應改用
Enum。