2024年7月17日 星期三

20.VB.NET 筆記 基礎篇 - 字串 (String)

VB.NET 字串(String)筆記(基礎篇)

VB.NET 字串(String) 筆記(基礎篇)

String 是用來保存文字資料的型別。名稱、訊息、備註、代碼、搜尋關鍵字、檔名與畫面顯示內容,通常都會用到字串。

字串處理的重點不只是把文字接在一起,還包含輸入清理、空值判斷、大小寫比較、搜尋、取代、切割與大量文字組合。表單程式常見錯誤,也多半來自沒有先處理空白、Nothing、大小寫或長度範圍。

先理解 String 是什麼

String:用來保存一段文字的資料型別,可包含中文字、英文字、數字、符號、空白與換行。字串內容通常使用雙引號表示,例如 "資料夾 A"

字串的核心特性

  • 可保存文字內容:適合姓名、標題、代碼、訊息、備註。
  • 長度可變:不需要像陣列一樣先指定固定長度。
  • 可能是空字串:"" 代表有字串物件,但內容長度為 0。
  • 可能是 Nothing:代表變數目前沒有指向任何字串物件。
  • 不可變性:每次修改字串,實際上通常會產生新的字串結果。

基本宣告

VB.NET
Dim displayTitle As String = "今日提醒"
Dim emptyText As String = ""
Dim missingText As String = Nothing
Dim multiLineText As String = "第一行" & vbCrLf & "第二行"
狀態 意思 建議處理
正常文字 有內容,例如 "A102" 可直接顯示、比較或處理。
空字串 "",長度為 0。 可用 String.IsNullOrEmpty 檢查。
空白文字 只有空白或換行。 可用 String.IsNullOrWhiteSpace 檢查。
Nothing 沒有字串物件。 不可直接呼叫 Length 等執行個體方法。

輸入清理與空值判斷

場景一:留言標題檢查

表單輸入常會包含前後空白。處理文字前,通常先用 Trim 清理,再判斷是否有有效內容。

需要的主控項
  • TextBoxTitle:輸入留言標題。
  • ButtonCheckTitle:檢查標題。
  • LabelTitleResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckTitle_Click(sender As Object, e As EventArgs) Handles ButtonCheckTitle.Click
        Dim titleText As String = TextBoxTitle.Text.Trim()

        If String.IsNullOrWhiteSpace(titleText) Then
            LabelTitleResult.Text = "標題不可空白"
            Return
        End If

        LabelTitleResult.Text = "標題已建立:" & titleText
    End Sub
End Class
畫面輸出結果(TextBoxTitle =  設備借用提醒 )
標題已建立:設備借用提醒
邏輯解析
  • Trim() 會移除字串前後空白。
  • String.IsNullOrWhiteSpace 可判斷 Nothing、空字串與只有空白的內容。
  • 先清理再判斷,可避免把空白誤當成有效輸入。

不可變性:修改後會產生新字串

不可變性:String 建立後,原本內容不會在原地被修改。像 ReplaceTrimToUpper 這些方法,通常會回傳處理後的新字串。

場景二:檔案標籤更名

這個範例示範 Replace 不會改掉原始字串,而是產生新的結果。若要使用修改後內容,需要把回傳值存起來。

需要的主控項
  • ButtonRenameTag:建立新標籤。
  • LabelRenameResult:顯示前後內容。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonRenameTag_Click(sender As Object, e As EventArgs) Handles ButtonRenameTag.Click
        Dim originalTag As String = "draft-folder"
        Dim newTag As String = originalTag.Replace("draft", "final")

        LabelRenameResult.Text = "原始標籤:" & originalTag & vbCrLf &
                                 "新標籤:" & newTag
    End Sub
End Class
畫面輸出結果(LabelRenameResult.Text)
原始標籤:draft-folder 新標籤:final-folder
邏輯解析
  • originalTag.Replace(...) 會回傳新字串。
  • originalTag 本身仍然是 draft-folder
  • 若寫了 originalTag.Replace(...) 卻沒有接住回傳值,處理結果就不會被使用。

取代、切割與格式整理

場景五:整理取號機輸出文字

外部來源的文字常會有空白、大小寫不一致或分隔符號混亂。這個範例先清理文字,再把 ticket 前綴統一成 T

需要的主控項
  • TextBoxTicket:輸入原始取號文字。
  • ButtonFormatTicket:整理文字。
  • LabelTicketResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonFormatTicket_Click(sender As Object, e As EventArgs) Handles ButtonFormatTicket.Click
        Dim rawText As String = TextBoxTicket.Text.Trim()

        If String.IsNullOrWhiteSpace(rawText) Then
            LabelTicketResult.Text = "請輸入取號文字"
            Return
        End If

        Dim formattedText As String = rawText.Replace("ticket", "T").Replace("Ticket", "T")
        formattedText = formattedText.Replace(" ", "").ToUpper()

        LabelTicketResult.Text = "整理後:" & formattedText
    End Sub
End Class
畫面輸出結果(TextBoxTicket = ticket - 038 )
整理後:T-038
邏輯解析
  • Trim 先移除前後空白。
  • Replace 可替換指定文字。
  • ToUpper 可統一英文大小寫。
  • 每次處理後都把結果重新指定給變數,才能保留新字串。

場景六:拆解置物櫃代碼

Split 可以依照分隔符號切開文字。切割前應先確認格式,避免資料筆數不足時造成後續索引錯誤。

需要的主控項
  • TextBoxLockerCode:輸入代碼,例如 B-014
  • ButtonParseLocker:拆解代碼。
  • LabelLockerResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonParseLocker_Click(sender As Object, e As EventArgs) Handles ButtonParseLocker.Click
        Dim lockerCode As String = TextBoxLockerCode.Text.Trim().ToUpper()
        Dim parts() As String = lockerCode.Split("-"c)

        If parts.Length <> 2 OrElse parts(0).Length = 0 OrElse parts(1).Length = 0 Then
            LabelLockerResult.Text = "代碼格式需為 區域-號碼,例如 B-014"
            Return
        End If

        LabelLockerResult.Text = "區域:" & parts(0) & vbCrLf &
                                 "號碼:" & parts(1)
    End Sub
End Class
畫面輸出結果(TextBoxLockerCode = b-014)
區域:B 號碼:014
邏輯解析
  • Split("-"c) 會用連字號切開字串。
  • 先檢查 parts.Length,避免直接使用不存在的索引。
  • 若代碼規則更複雜,應建立專門的驗證方法集中處理。

StringBuilder:大量組合文字

StringBuilder:適合在迴圈中大量追加文字,或需要逐行建立長文字內容時使用。少量字串連接可直接用 &,大量反覆拼接才需要優先考慮 StringBuilder

場景七:建立課程提醒清單

這個範例把多筆提醒逐行加入結果文字。由於內容是逐段累加,多行輸出使用 StringBuilder 會比反覆字串連接更清楚。

需要的主控項
  • ButtonBuildReminder:建立提醒清單。
  • TextBoxResult:顯示多行結果,建議設定 Multiline=True
範例程式碼
VB.NET / Windows Forms
Imports System.Text

Public Class Form1
    Private Sub ButtonBuildReminder_Click(sender As Object, e As EventArgs) Handles ButtonBuildReminder.Click
        TextBoxResult.Multiline = True

        Dim reminders() As String = {
            "投影機測試",
            "講義補印",
            "簽到表準備",
            "茶水確認"
        }

        Dim builder As New StringBuilder()
        builder.AppendLine("課程提醒清單")
        builder.AppendLine("--------------")

        For Each item As String In reminders
            builder.AppendLine("- " & item)
        Next

        TextBoxResult.Text = builder.ToString()
    End Sub
End Class
畫面輸出結果(TextBoxResult)
課程提醒清單 -------------- - 投影機測試 - 講義補印 - 簽到表準備 - 茶水確認
邏輯解析
  • StringBuilder 適合逐段追加內容。
  • AppendLine 會自動加入換行。
  • 最後用 ToString() 轉成一般字串,再放到控制項顯示。

實務判斷與常見誤區

常見問題整理

  • 沒有先清理輸入:前後空白會影響比較、搜尋與代碼判斷。
  • 直接呼叫 Nothing 的方法:字串可能是 Nothing 時,應先檢查。
  • 大小寫比較不明確:需要忽略大小寫時,應明確指定 StringComparison
  • 誤以為 Replace 會改掉原字串:字串方法通常回傳新字串,需接住結果。
  • 少量文字也硬用 StringBuilder:簡單顯示文字直接用 & 即可。
  • 切割後直接取索引:使用 Split 後應先檢查陣列長度。
需求 建議做法 原因
檢查是否有輸入 String.IsNullOrWhiteSpace 可同時處理 Nothing、空字串與空白。
少量組合文字 使用 & 簡單直覺,不需要額外物件。
大量逐行組合 使用 StringBuilder 結構較清楚,也適合迴圈追加。
忽略大小寫比較 String.Equals 搭配 StringComparison 語意明確,避免隱性比較規則。
搜尋位置 IndexOf 可取得位置,也能判斷是否存在。

重點整理

  1. String 用來保存文字資料,可包含符號、空白與換行。
  2. 字串可能是正常文字、空字串、空白文字或 Nothing
  3. 處理表單輸入前,常需要先使用 TrimString.IsNullOrWhiteSpace
  4. 字串具有不可變性,ReplaceToUpper 等方法會回傳新字串。
  5. 比較文字時,應明確決定是否忽略大小寫。
  6. IndexOf 找不到文字時會回傳 -1
  7. Split 後應先檢查陣列長度,再讀取指定位置。
  8. 少量字串連接可使用 &,大量逐段追加可使用 StringBuilder