2024年6月16日 星期日

16.VB.NET 筆記 核心篇 - 基本資料類型 (Basic Data Types)

VB.NET 基本資料類型(Basic Data Types)筆記(核心篇)

VB.NET 基本資料類型 筆記(核心篇)

資料類型用來決定變數可以保存什麼資料,也決定資料能做什麼運算。數量適合用整數,金額適合用 Decimal,日期應使用 Date,文字則依照單一字元或整段內容選擇 CharString

型別不是單純語法名稱,而是資料設計的第一步。型別選得清楚,後續的輸入檢查、計算、格式化與維護都會更穩定。這篇以 Windows Forms 範例整理 BooleanIntegerDecimalStringCharDate 的使用方式。

先理解資料類型在做什麼

型別讓資料有明確用途

每個變數都應該符合資料本質。若資料只有是或否,適合使用 Boolean;若資料要做金額計算,適合使用 Decimal;若資料要進行日期加減,適合使用 Date

  • 資料能不能計算:數值型別可以運算,文字型別主要用於內容處理。
  • 資料是否需要小數:件數通常是 Integer,金額通常是 Decimal
  • 資料是否只有兩種狀態:是或否、開或關,適合 Boolean
  • 資料是否需要日期規則:到期日、預約日、截止時間,適合 Date
型別 適合資料 常見用途
Boolean True / False 是否啟用、是否完成、是否勾選。
Integer 沒有小數的整數。 人數、數量、次數、索引。
Decimal 需要精確的小數。 金額、費用、折扣、報表數值。
String 一段文字。 姓名、說明、訊息、代碼字串。
Char 單一字元。 等級字母、分類代碼、單一符號。
Date 日期與時間。 預約日、到期日、建立時間、截止時間。

基本宣告範例

VB.NET
Dim isReady As Boolean = True
Dim visitorCount As Integer = 35
Dim feeAmount As Decimal = 120.5D
Dim displayName As String = "閱讀區 A"
Dim levelCode As Char = "B"c
Dim reserveDate As Date = Date.Today

Boolean:兩種狀態的判斷

場景一:自助影印機是否可使用

Boolean 適合表示只有兩種結果的狀態。這個範例用紙張與機門狀態判斷影印機是否可使用。

需要的主控項
  • CheckBoxHasPaper:是否有紙。
  • CheckBoxDoorClosed:機門是否關閉。
  • ButtonCheckMachine:檢查影印機狀態。
  • LabelMachineStatus:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckMachine_Click(sender As Object, e As EventArgs) Handles ButtonCheckMachine.Click
        Dim hasPaper As Boolean = CheckBoxHasPaper.Checked
        Dim doorClosed As Boolean = CheckBoxDoorClosed.Checked
        Dim canCopy As Boolean = hasPaper AndAlso doorClosed

        If canCopy Then
            LabelMachineStatus.Text = "影印機狀態:可使用"
        Else
            LabelMachineStatus.Text = "影印機狀態:請確認紙張與機門"
        End If
    End Sub
End Class
畫面輸出結果(兩個 CheckBox 都勾選)
影印機狀態:可使用
邏輯解析
  • CheckBox.Checked 本身就是 Boolean
  • AndAlso 表示兩個條件都成立,結果才是 True
  • 若狀態超過兩種,例如待機、缺紙、維修中,通常更適合改用 Enum

Integer:沒有小數的數量

場景二:講座剩餘座位計算

Integer 適合人數、件數與次數。這個範例用座位總數與已報名人數計算剩餘座位。

需要的主控項
  • TextBoxRegistered:輸入已報名人數。
  • ButtonCheckSeats:計算剩餘座位。
  • LabelSeatResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckSeats_Click(sender As Object, e As EventArgs) Handles ButtonCheckSeats.Click
        Dim totalSeats As Integer = 48
        Dim registeredCount As Integer

        If Not Integer.TryParse(TextBoxRegistered.Text.Trim(), registeredCount) Then
            LabelSeatResult.Text = "請輸入正確人數"
            Return
        End If

        If registeredCount < 0 OrElse registeredCount > totalSeats Then
            LabelSeatResult.Text = "報名人數超出合理範圍"
            Return
        End If

        Dim remainingSeats As Integer = totalSeats - registeredCount
        LabelSeatResult.Text = "剩餘座位:" & remainingSeats.ToString() & " 位"
    End Sub
End Class
畫面輸出結果(TextBoxRegistered = 31)
剩餘座位:17 位
邏輯解析
  • 座位數與人數沒有小數,適合使用 Integer
  • Integer.TryParse 可避免輸入非數字時直接發生例外。
  • 輸入成功後再檢查範圍,可讓錯誤訊息更明確。

Decimal:金額與精確小數

場景三:列印服務費用試算

只要資料涉及金額、費用或精確小數,通常優先考慮 Decimal。這個範例依照頁數與單頁費用計算列印總額。

需要的主控項
  • TextBoxPageCount:輸入列印頁數。
  • ButtonCalculateFee:計算費用。
  • LabelFee:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCalculateFee_Click(sender As Object, e As EventArgs) Handles ButtonCalculateFee.Click
        Dim pageCount As Integer

        If Not Integer.TryParse(TextBoxPageCount.Text.Trim(), pageCount) OrElse pageCount <= 0 Then
            LabelFee.Text = "請輸入大於 0 的頁數"
            Return
        End If

        Dim pricePerPage As Decimal = 1.5D
        Dim bindingFee As Decimal = 12D
        Dim totalFee As Decimal = pageCount * pricePerPage + bindingFee

        LabelFee.Text = "列印費用:" & totalFee.ToString("N1") & " 元"
    End Sub
End Class
畫面輸出結果(TextBoxPageCount = 26)
列印費用:51.0 元
邏輯解析
  • pricePerPagebindingFee 使用 Decimal
  • 數值後方的 D 代表 Decimal 常值。
  • ToString("N1") 會顯示千分位並保留一位小數。

金額計算建議:價格、費用、折扣與報表金額通常使用 Decimal。一般浮點型別較適合科學計算或量測資料,不適合作為金額核心計算的第一選擇。

String 與 Char:文字與單一字元

場景四:置物櫃代碼顯示

String 用來保存一段文字,Char 用來保存單一字元。這個範例用區域字母與櫃號組合成置物櫃代碼。

需要的主控項
  • TextBoxLockerNo:輸入櫃號。
  • ButtonBuildLockerCode:建立置物櫃代碼。
  • LabelLocker:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonBuildLockerCode_Click(sender As Object, e As EventArgs) Handles ButtonBuildLockerCode.Click
        Dim areaCode As Char = "C"c
        Dim lockerNo As String = TextBoxLockerNo.Text.Trim()

        If lockerNo = String.Empty Then
            LabelLocker.Text = "請輸入櫃號"
            Return
        End If

        Dim lockerCode As String = areaCode & "-" & lockerNo.PadLeft(3, "0"c)
        LabelLocker.Text = "置物櫃代碼:" & lockerCode
    End Sub
End Class
畫面輸出結果(TextBoxLockerNo = 8)
置物櫃代碼:C-008
邏輯解析
  • "C"cChar,代表單一字元。
  • lockerNoString,適合保存輸入文字。
  • PadLeft(3, "0"c) 會把櫃號補成三位數。

Date:日期與時間

場景五:借閱到期日計算

日期不應只當成字串處理。使用 Date 後,可以直接加天數、比較日期,也能格式化成需要的顯示樣式。

需要的主控項
  • DateTimePickerBorrow:選擇借閱日期。
  • ButtonShowDueDate:計算到期日。
  • LabelDueDate:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonShowDueDate_Click(sender As Object, e As EventArgs) Handles ButtonShowDueDate.Click
        Dim borrowDate As Date = DateTimePickerBorrow.Value.Date
        Dim dueDate As Date = borrowDate.AddDays(14)

        LabelDueDate.Text = "借閱日:" & borrowDate.ToString("yyyy-MM-dd") & vbCrLf &
                            "到期日:" & dueDate.ToString("yyyy-MM-dd")
    End Sub
End Class
畫面輸出結果(借閱日 = 2025-04-18)
借閱日:2025-04-18 到期日:2025-05-02
邏輯解析
  • DateTimePicker.Value.Date 取得日期部分。
  • AddDays(14) 直接計算 14 天後的日期。
  • ToString("yyyy-MM-dd") 控制日期顯示格式。

綜合應用:輸入轉型與驗證

場景六:講座報名資料檢查

Windows Forms 的 TextBox 內容一開始都是文字。若要把輸入轉成數字或日期,應先用 TryParse 檢查是否能轉換,再進行後續計算。

需要的主控項
  • TextBoxName:輸入姓名。
  • TextBoxPeople:輸入報名人數。
  • TextBoxDonate:輸入自願贊助金額。
  • DateTimePickerVisit:選擇參加日期。
  • ButtonValidateSignup:檢查資料。
  • LabelSignupResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonValidateSignup_Click(sender As Object, e As EventArgs) Handles ButtonValidateSignup.Click
        Dim visitorName As String = TextBoxName.Text.Trim()

        If visitorName.Length < 2 Then
            LabelSignupResult.Text = "姓名至少需要 2 個字"
            Return
        End If

        Dim peopleCount As Integer
        If Not Integer.TryParse(TextBoxPeople.Text.Trim(), peopleCount) OrElse peopleCount <= 0 Then
            LabelSignupResult.Text = "報名人數必須是大於 0 的整數"
            Return
        End If

        Dim donateAmount As Decimal
        If Not Decimal.TryParse(TextBoxDonate.Text.Trim(), donateAmount) OrElse donateAmount < 0D Then
            LabelSignupResult.Text = "贊助金額必須是 0 以上數值"
            Return
        End If

        Dim visitDate As Date = DateTimePickerVisit.Value.Date

        LabelSignupResult.Text = "報名完成:" & visitorName & vbCrLf &
                                 "人數:" & peopleCount.ToString() & vbCrLf &
                                 "贊助:" & donateAmount.ToString("N0") & " 元" & vbCrLf &
                                 "日期:" & visitDate.ToString("yyyy-MM-dd")
    End Sub
End Class
畫面輸出結果
報名完成:陳小姐 人數:2 贊助:300 元 日期:2025-04-26
邏輯解析
  • TextBoxName.TextString,適合檢查長度。
  • Integer.TryParse 用來轉換報名人數。
  • Decimal.TryParse 用來轉換金額。
  • DateTimePickerVisit.Value.Date 直接取得 Date
  • 先轉型與驗證,再進行顯示或計算,流程比較穩定。

實務判斷與常見誤區

常見問題整理

  • 把數字都當 String:顯示可以是文字,但計算前應轉成合適數值型別。
  • 金額使用浮點型別:金額與精確小數通常優先使用 Decimal
  • 直接轉型使用者輸入:輸入不一定合法,建議使用 TryParse
  • 日期用字串相加:日期應使用 Date 與日期方法處理。
  • Boolean 承載太多狀態:若狀態超過兩種,通常應改用 Enum
資料情境 建議型別 原因
是否勾選、是否完成 Boolean 只有兩種結果。
人數、頁數、次數 Integer 不需要小數。
價格、費用、折扣 Decimal 需要精確小數。
姓名、備註、訊息 String 長度不固定的文字。
單一等級字母 Char 只保存一個字元。
到期日、預約時間 Date 需要日期運算與格式化。

重點整理

  1. 資料類型會決定變數能保存什麼資料,以及能進行哪些操作。
  2. Boolean 適合兩種狀態,例如是或否、開或關。
  3. Integer 適合沒有小數的數量,例如人數、頁數與次數。
  4. Decimal 適合金額與精確小數。
  5. String 適合一段文字,Char 適合單一字元。
  6. Date 適合日期與時間,可直接加減與格式化。
  7. 使用者輸入轉數字時,建議使用 TryParse 而不是直接轉型。
  8. 型別選擇應從資料本質出發,而不是只看目前畫面如何顯示。