2024年6月20日 星期四

17.VB.NET 筆記 核心篇 - 布林值 (Boolean)

VB.NET 布林值(Boolean)筆記(核心篇)

VB.NET 布林值(Boolean) 筆記(核心篇)

Boolean 是用來表示邏輯結果的型別,只有 TrueFalse 兩種值。只要需求是在判斷是否成立、是否允許、是否勾選、是否完成,就常會用到布林值。

Boolean 的重點不是只會存放 True 或 False,而是讓條件流程變清楚。好的布林變數名稱會像一句判斷問題,例如 isReadycanSubmithasPermission,閱讀時就能直接看懂判斷意義。

先理解 Boolean 在做什麼

Boolean 表示條件是否成立

Boolean 適合保存「是或否」的結果。它通常不是最終畫面文字,而是程式用來決定下一步流程的依據。

  • 狀態:是否啟用、是否完成、是否鎖定。
  • 條件:分數是否達標、輸入是否有效、權限是否足夠。
  • 控制流程:搭配 IfElse 決定執行哪一段程式。
  • 組合判斷:使用 AndAlsoOrElseNot 組合多個條件。

Boolean 適合用在只有兩種結果的情境。 若狀態其實有三種以上,例如「未開始、處理中、完成、失敗」,就不適合硬塞成多個 Boolean,通常應改用 Enum 表示狀態。

基本宣告

VB.NET
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:顯示核驗結果。
範例程式碼
VB.NET / Windows Forms
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 兩邊不同才成立。 兩個選項只能選其中一個。

場景二:會議室開放條件

這個範例示範 AndAlsoOrElseNot。會議室要開放,必須已完成清潔,而且不能維修中;若有預約或屬於開放時段,就可以提出使用申請。

需要的主控項
  • CheckBoxCleaned:是否已清潔。
  • CheckBoxMaintenance:是否維修中。
  • CheckBoxReserved:是否已有預約。
  • CheckBoxOpenHour:是否為開放時段。
  • ButtonCheckRoom:檢查會議室。
  • LabelRoomResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
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 的短路判斷

短路判斷:AndAlsoOrElse 會在結果已經確定時停止往後檢查。這不只是效能問題,也能避免後面的判斷在資料不合法時發生錯誤。

場景三:優惠碼輸入檢查

這個範例先確認優惠碼不是空白,再檢查長度。若沒有先判斷空白,就直接處理後續規則,程式可讀性會變差。

需要的主控項
  • TextBoxCoupon:輸入優惠碼。
  • ButtonCheckCoupon:檢查優惠碼。
  • LabelCouponResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
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
畫面輸出結果(TextBoxCoupon = SPRING25)
優惠碼格式正確
邏輯解析
  • hasCoupon 先表示是否有輸入內容。
  • AndAlso 左邊若為 False,右邊就不需要繼續判斷。
  • 條件拆開命名後,判斷目的會比直接寫一大串更清楚。

If 判斷與 Boolean

場景四:設備巡檢是否通過

Boolean 最常和 If 搭配使用。這個範例用三個檢查項目組成巡檢結果,全部通過才顯示可啟用。

需要的主控項
  • CheckBoxPower:電源正常。
  • CheckBoxNetwork:網路正常。
  • CheckBoxSensor:感測器正常。
  • ButtonCheckDevice:檢查設備。
  • LabelDeviceResult:顯示巡檢結果。
範例程式碼
VB.NET / Windows Forms
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 可安全轉換 TrueFalse,轉換失敗時不會中斷程式。

需要的主控項
  • TextBoxSetting:輸入設定值,例如 true
  • ButtonReadSetting:讀取設定。
  • LabelSettingResult:顯示轉換結果。
範例程式碼
VB.NET / Windows Forms
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
畫面輸出結果(TextBoxSetting = true)
自動儲存:已啟用
邏輯解析
  • Boolean.TryParse 成功時會回傳 True,並把結果放入 autoSaveEnabled
  • 輸入 truefalse 可以成功轉換,不分大小寫。
  • 若外部資料可能不合法,TryParseParse 更適合。

Xor:只能成立其中一邊

場景六:通知方式二選一

Xor 表示兩邊不同時才成立。這個範例要求「簡訊」與「Email」只能選一個,不能都不選,也不能兩個都選。

需要的主控項
  • CheckBoxSms:簡訊通知。
  • CheckBoxEmail:Email 通知。
  • ButtonCheckNotify:檢查通知方式。
  • LabelNotifyResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
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
畫面輸出結果(只勾選 Email)
通知方式設定完成
邏輯解析
  • Xor 在兩邊不同時回傳 True
  • 只勾選簡訊或只勾選 Email,都會通過。
  • 兩個都勾選或兩個都不勾選,都會失敗。

實務判斷與常見誤區

常見問題整理

  • 用 0 / 1 代替 Boolean:程式會失去語意,閱讀時不容易看出判斷目的。
  • 布林變數命名不清楚:flag1check 這類名稱不容易理解。
  • 條件全部塞進 If:複雜條件可以先拆成 canSubmitisValid 等變數。
  • 用多個 Boolean 表示流程狀態:狀態超過兩種時,通常應使用 Enum
  • 外部文字直接 Parse:輸入可能不合法,建議使用 Boolean.TryParse
需求 適合 Boolean 不適合 Boolean
是否完成 完成 / 未完成。 未開始 / 進行中 / 完成 / 失敗。
是否允許 可入場 / 不可入場。 一般票 / 工作證 / 貴賓證 / 臨時證。
是否勾選 CheckBox 是否勾選。 多個分類選項與權限組合,可能更適合 Flags Enum

重點整理

  1. Boolean 只有 TrueFalse 兩種值。
  2. Boolean 適合表示是否成立、是否允許、是否啟用、是否完成。
  3. AndAlso 表示兩個條件都要成立。
  4. OrElse 表示其中一個條件成立即可。
  5. Not 會反轉布林結果。
  6. Xor 適合判斷兩個條件是否只有其中一個成立。
  7. Boolean.TryParse 適合把外部文字安全轉成布林值。
  8. 狀態超過兩種時,不宜硬用 Boolean,通常應改用 Enum