2024年7月5日 星期五

19.VB.NET 筆記 基礎篇 - Byte

VB.NET Byte 資料型別筆記(基礎篇)

VB.NET Byte 資料型別 筆記(基礎篇)

Byte 是 VB.NET 中用來保存小範圍非負整數的資料型別,範圍固定是 0255。它適合表示色彩分量、裝置等級、小型代碼、位元旗標與原始位元資料。

Byte 的重點不是「數字比較小所以一定要用」,而是資料本質確實只有 0 到 255。若資料可能超過範圍,或會先進行加總、乘法、統計,通常應先用 Integer 承接運算結果,再確認是否能安全轉回 Byte。

先理解 Byte 的範圍

Byte:無符號整數型別,大小為 1 byte,也就是 8 位元。可保存的整數範圍是 0255

Byte 適合表示固定小範圍值

Byte 最大只能到 255,因此適合描述本來就被限制在這個範圍內的資料。例如 RGB 顏色值就是 0 到 255,這種資料使用 Byte 會很自然。

  • 可用範圍:0255
  • 不可保存:負數、小數、超過 255 的整數。
  • 預設值:若欄位未指定,數值預設為 0
  • 常見用途:RGB、位元旗標、資料封包、小型狀態碼。
項目 內容 實務意義
最小值 Byte.MinValue = 0 不能保存負數。
最大值 Byte.MaxValue = 255 輸入或運算結果不可超過 255。
大小 1 byte / 8 bits 適合大量小範圍原始資料。
適合資料 固定小範圍整數。 色彩值、旗標、位元資料。

宣告與基本使用

基本宣告

VB.NET
Dim levelValue As Byte = 3
Dim brightness As Byte = 180
Dim maxByteValue As Byte = Byte.MaxValue

直接指定常數時,值必須落在 0 到 255 之間。若寫成 Dim value As Byte = 300,就超出 Byte 可保存範圍。

場景一:閱讀燈亮度等級

亮度值若設計成 0 到 255,Byte 就很適合表示目前亮度。這個範例將亮度值顯示在 Label 上。

需要的主控項
  • ButtonShowBrightness:顯示亮度。
  • LabelBrightness:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonShowBrightness_Click(sender As Object, e As EventArgs) Handles ButtonShowBrightness.Click
        Dim lampBrightness As Byte = 180
        LabelBrightness.Text = "閱讀燈亮度:" & lampBrightness.ToString() & " / 255"
    End Sub
End Class
畫面輸出結果(LabelBrightness.Text)
閱讀燈亮度:180 / 255
邏輯解析
  • 180 落在 Byte 的合法範圍內。
  • 亮度上限若固定是 255,使用 Byte 能清楚表達資料範圍。
  • 若亮度需要小數或百分比計算,可另外使用其他型別處理顯示。

應用一:RGB 顏色分量

場景二:自訂公告底色

RGB 的紅、綠、藍三個分量都在 0 到 255 之間,因此很適合用 Byte 保存。這個範例用三個 Byte 值建立 Panel 背景色。

需要的主控項
  • ButtonApplyColor:套用顏色。
  • PanelNotice:顯示顏色預覽。
  • LabelColor:顯示 RGB 數值。
範例程式碼
VB.NET / Windows Forms
Imports System.Drawing

Public Class Form1
    Private Sub ButtonApplyColor_Click(sender As Object, e As EventArgs) Handles ButtonApplyColor.Click
        Dim redValue As Byte = 255
        Dim greenValue As Byte = 214
        Dim blueValue As Byte = 120

        PanelNotice.BackColor = Color.FromArgb(redValue, greenValue, blueValue)
        LabelColor.Text = "RGB(" & redValue.ToString() & ", " &
                          greenValue.ToString() & ", " &
                          blueValue.ToString() & ")"
    End Sub
End Class
畫面效果
PanelNotice 會顯示偏暖黃色背景。 LabelColor 顯示:RGB(255, 214, 120)
邏輯解析
  • Color.FromArgb 可接收 0 到 255 的色彩分量。
  • Byte 的範圍剛好符合 RGB 通道值。
  • 色彩值若來自 TextBox,仍需要先驗證輸入範圍。

應用二:文字輸入安全轉成 Byte

場景三:輸入音量值

TextBox 取得的內容一開始都是字串。若要轉成 Byte,建議先使用 Byte.TryParse,讓格式錯誤或範圍超出時能安全處理。

需要的主控項
  • TextBoxVolume:輸入音量值。
  • ButtonSetVolume:設定音量。
  • LabelVolume:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonSetVolume_Click(sender As Object, e As EventArgs) Handles ButtonSetVolume.Click
        Dim volumeValue As Byte

        If Not Byte.TryParse(TextBoxVolume.Text.Trim(), volumeValue) Then
            LabelVolume.Text = "音量必須是 0 到 255 的整數"
            Return
        End If

        LabelVolume.Text = "音量設定:" & volumeValue.ToString()
    End Sub
End Class
畫面輸出結果(TextBoxVolume = 86)
音量設定:86
邏輯解析
  • Byte.TryParse 會同時檢查格式與 Byte 範圍。
  • 輸入 -1300 或非數字文字時,轉換會失敗。
  • 表單輸入不適合直接用 CByte,因為錯誤輸入可能造成例外。

型別轉換與運算

場景四:兩個感測值平均

Byte 可以保存小範圍值,但運算時不一定適合一直留在 Byte。若需要加總、平均或乘法,建議先用 IntegerDecimal 承接中間結果。

需要的主控項
  • ButtonAverage:計算平均。
  • LabelAverage:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonAverage_Click(sender As Object, e As EventArgs) Handles ButtonAverage.Click
        Dim firstSignal As Byte = 210
        Dim secondSignal As Byte = 240

        Dim totalSignal As Integer = firstSignal + secondSignal
        Dim averageSignal As Decimal = totalSignal / 2D

        LabelAverage.Text = "平均感測值:" & averageSignal.ToString("N1")
    End Sub
End Class
畫面輸出結果(LabelAverage.Text)
平均感測值:225.0
邏輯解析
  • 單筆感測值適合用 Byte 保存。
  • 210 + 240 的中間結果是 450,已超過 Byte 上限。
  • 先用 Integer 承接加總,可避免中間結果受 Byte 範圍限制。
轉換方向 風險 建議做法
Byte → Integer 風險低。 可直接指定。
Integer → Byte 可能超出 0 到 255。 先檢查範圍,再使用 CByte
String → Byte 可能格式錯誤或超出範圍。 使用 Byte.TryParse

應用三:位元旗標

場景五:檢查自助機功能開關

Byte 有 8 個位元,可用來保存多個開關狀態。每個旗標使用 1、2、4、8 這類數值,透過 Or 組合,透過 And 檢查。

需要的主控項
  • ButtonCheckFeature:檢查功能。
  • LabelFeature:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Const FeaturePrint As Byte = 1
    Private Const FeatureScan As Byte = 2
    Private Const FeaturePayCard As Byte = 4

    Private Sub ButtonCheckFeature_Click(sender As Object, e As EventArgs) Handles ButtonCheckFeature.Click
        Dim enabledFeatures As Byte = CByte(FeaturePrint Or FeaturePayCard)
        Dim canPayByCard As Boolean = (enabledFeatures And FeaturePayCard) = FeaturePayCard

        If canPayByCard Then
            LabelFeature.Text = "功能狀態:支援刷卡付款"
        Else
            LabelFeature.Text = "功能狀態:不支援刷卡付款"
        End If
    End Sub
End Class
畫面輸出結果(LabelFeature.Text)
功能狀態:支援刷卡付款
邏輯解析
  • FeaturePrint Or FeaturePayCard 將兩個旗標組合起來。
  • And FeaturePayCard 用來檢查組合中是否包含刷卡功能。
  • 若旗標數量很多或需要更清楚的語意,可考慮使用 <Flags> Enum

溢位與安全回存

Byte 最常見的錯誤

  • 超過 255:例如輸入 300 或加總後變成 450。
  • 出現負數:Byte 不能保存 -1。
  • 直接轉型:未檢查範圍就使用 CByte,可能造成例外。
  • 運算仍想回存 Byte:中間結果應先用較大範圍型別承接。

場景六:安全調整亮度值

這個範例先把 Byte 轉成 Integer 做加法,再檢查結果是否仍在 0 到 255。只有合法時才回存為 Byte。

需要的主控項
  • ButtonIncreaseLight:增加亮度。
  • LabelLightResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonIncreaseLight_Click(sender As Object, e As EventArgs) Handles ButtonIncreaseLight.Click
        Dim currentLight As Byte = 230
        Dim increaseValue As Integer = 40
        Dim newValue As Integer = currentLight + increaseValue

        If newValue > Byte.MaxValue Then
            LabelLightResult.Text = "亮度調整失敗:超出 Byte 上限"
            Return
        End If

        Dim safeLight As Byte = CByte(newValue)
        LabelLightResult.Text = "新亮度:" & safeLight.ToString()
    End Sub
End Class
畫面輸出結果(230 + 40)
亮度調整失敗:超出 Byte 上限
邏輯解析
  • 230 + 40 的結果是 270,超過 Byte.MaxValue
  • 中間結果用 Integer 保存,避免直接回存 Byte 發生錯誤。
  • 確認結果不超過 255 後,才適合使用 CByte 轉回 Byte。

實務判斷與常見誤區

資料情境 適合 Byte 不適合 Byte
固定小範圍 0 到 255 的等級、色彩值、旗標值。 可能超過 255 的計數或總量。
是否可能負數 永遠不會是負數。 可能出現差額、溫度、位移等負值。
是否需要運算 單筆保存或簡單傳遞。 大量加總、平均、乘法,應先用較大型別。
輸入來源 已確認範圍的資料。 未驗證的 TextBox 或外部資料。

選型提醒:若只是一般數量,例如人數、頁數、訂單筆數,不需要刻意使用 Byte。除非資料本質明確限制在 0 到 255,否則 Integer 通常會更直覺。

重點整理

  1. Byte 是 0 到 255 的無符號整數型別。
  2. Byte 不能保存負數,也不能保存超過 255 的值。
  3. RGB 色彩分量、位元旗標與小型代碼很適合使用 Byte。
  4. TextBox 輸入轉 Byte 時,建議使用 Byte.TryParse
  5. Byte 轉成 Integer 風險低,但 Integer 轉回 Byte 前要檢查範圍。
  6. 加總、平均、乘法等運算應先用較大範圍型別承接結果。
  7. 確認運算結果介於 Byte.MinValueByte.MaxValue 後,才適合使用 CByte 回存。
  8. 若資料只是一般數量且沒有明確 0 到 255 限制,通常使用 Integer 更合適。