VB.NET 字串(String) 筆記(基礎篇)
String 是用來保存文字資料的型別。名稱、訊息、備註、代碼、搜尋關鍵字、檔名與畫面顯示內容,通常都會用到字串。
字串處理的重點不只是把文字接在一起,還包含輸入清理、空值判斷、大小寫比較、搜尋、取代、切割與大量文字組合。表單程式常見錯誤,也多半來自沒有先處理空白、Nothing、大小寫或長度範圍。
先理解 String 是什麼
String:用來保存一段文字的資料型別,可包含中文字、英文字、數字、符號、空白與換行。字串內容通常使用雙引號表示,例如 "資料夾 A"。
字串的核心特性
- 可保存文字內容:適合姓名、標題、代碼、訊息、備註。
- 長度可變:不需要像陣列一樣先指定固定長度。
- 可能是空字串:
""代表有字串物件,但內容長度為 0。 - 可能是 Nothing:代表變數目前沒有指向任何字串物件。
- 不可變性:每次修改字串,實際上通常會產生新的字串結果。
基本宣告
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:顯示結果。
範例程式碼
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
邏輯解析
Trim()會移除字串前後空白。String.IsNullOrWhiteSpace可判斷Nothing、空字串與只有空白的內容。- 先清理再判斷,可避免把空白誤當成有效輸入。
不可變性:修改後會產生新字串
不可變性:String 建立後,原本內容不會在原地被修改。像 Replace、Trim、ToUpper 這些方法,通常會回傳處理後的新字串。
場景二:檔案標籤更名
這個範例示範 Replace 不會改掉原始字串,而是產生新的結果。若要使用修改後內容,需要把回傳值存起來。
需要的主控項
ButtonRenameTag:建立新標籤。LabelRenameResult:顯示前後內容。
範例程式碼
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
邏輯解析
originalTag.Replace(...)會回傳新字串。originalTag本身仍然是draft-folder。- 若寫了
originalTag.Replace(...)卻沒有接住回傳值,處理結果就不會被使用。
比較與搜尋
場景三:活動代碼大小寫比對
字串比較需要先決定是否區分大小寫。若代碼輸入可能有大小寫差異,可使用 String.Equals 搭配 StringComparison.OrdinalIgnoreCase。
需要的主控項
TextBoxAccessCode:輸入活動代碼。ButtonCheckCode:檢查代碼。LabelCodeResult:顯示結果。
範例程式碼
Public Class Form1
Private Sub ButtonCheckCode_Click(sender As Object, e As EventArgs) Handles ButtonCheckCode.Click
Dim correctCode As String = "ZONE-A7"
Dim inputCode As String = TextBoxAccessCode.Text.Trim()
If String.Equals(inputCode, correctCode, StringComparison.OrdinalIgnoreCase) Then
LabelCodeResult.Text = "代碼正確"
Else
LabelCodeResult.Text = "代碼不符合"
End If
End Sub
End Class
邏輯解析
StringComparison.OrdinalIgnoreCase表示比對時忽略大小寫。- 比起先全部轉大寫再比較,這種寫法更明確表達比較目的。
- 若大小寫本來就有不同意義,就不應忽略大小寫。
場景四:從置物櫃紀錄尋找區域
IndexOf 可以找出指定文字第一次出現的位置。找不到時會回傳 -1,因此常用 >= 0 判斷是否找到。
需要的主控項
TextBoxKeyword:輸入要找的區域,例如B區。ButtonSearchLocker:搜尋紀錄。LabelSearchResult:顯示結果。
範例程式碼
Public Class Form1
Private Sub ButtonSearchLocker_Click(sender As Object, e As EventArgs) Handles ButtonSearchLocker.Click
Dim recordText As String = "置物櫃紀錄:A區滿位,B區尚有 3 格,C區維護中"
Dim keyword As String = TextBoxKeyword.Text.Trim()
If String.IsNullOrWhiteSpace(keyword) Then
LabelSearchResult.Text = "請輸入搜尋文字"
Return
End If
Dim foundIndex As Integer = recordText.IndexOf(keyword, StringComparison.Ordinal)
If foundIndex >= 0 Then
LabelSearchResult.Text = "找到位置:" & foundIndex.ToString()
Else
LabelSearchResult.Text = "找不到指定文字"
End If
End Sub
End Class
邏輯解析
IndexOf找到文字時會回傳起始位置。IndexOf找不到文字時會回傳-1。- 需要忽略大小寫搜尋英文時,可改用
StringComparison.OrdinalIgnoreCase。
| 方法 | 用途 | 注意事項 |
|---|---|---|
| String.Equals | 比較兩段文字是否相同。 | 可搭配 StringComparison。 |
| IndexOf | 取得文字位置。 | 找不到會回傳 -1。 |
| Contains | 判斷是否包含指定文字。 | 舊版 .NET Framework 不一定有 StringComparison 多載。 |
| StartsWith | 檢查開頭。 | 適合代碼前綴判斷。 |
| EndsWith | 檢查結尾。 | 適合副檔名或尾碼判斷。 |
取代、切割與格式整理
場景五:整理取號機輸出文字
外部來源的文字常會有空白、大小寫不一致或分隔符號混亂。這個範例先清理文字,再把 ticket 前綴統一成 T。
需要的主控項
TextBoxTicket:輸入原始取號文字。ButtonFormatTicket:整理文字。LabelTicketResult:顯示結果。
範例程式碼
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
邏輯解析
Trim先移除前後空白。Replace可替換指定文字。ToUpper可統一英文大小寫。- 每次處理後都把結果重新指定給變數,才能保留新字串。
場景六:拆解置物櫃代碼
Split 可以依照分隔符號切開文字。切割前應先確認格式,避免資料筆數不足時造成後續索引錯誤。
需要的主控項
TextBoxLockerCode:輸入代碼,例如B-014。ButtonParseLocker:拆解代碼。LabelLockerResult:顯示結果。
範例程式碼
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
邏輯解析
Split("-"c)會用連字號切開字串。- 先檢查
parts.Length,避免直接使用不存在的索引。 - 若代碼規則更複雜,應建立專門的驗證方法集中處理。
StringBuilder:大量組合文字
StringBuilder:適合在迴圈中大量追加文字,或需要逐行建立長文字內容時使用。少量字串連接可直接用 &,大量反覆拼接才需要優先考慮 StringBuilder。
場景七:建立課程提醒清單
這個範例把多筆提醒逐行加入結果文字。由於內容是逐段累加,多行輸出使用 StringBuilder 會比反覆字串連接更清楚。
需要的主控項
ButtonBuildReminder:建立提醒清單。TextBoxResult:顯示多行結果,建議設定Multiline=True。
範例程式碼
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
邏輯解析
StringBuilder適合逐段追加內容。AppendLine會自動加入換行。- 最後用
ToString()轉成一般字串,再放到控制項顯示。
實務判斷與常見誤區
常見問題整理
- 沒有先清理輸入:前後空白會影響比較、搜尋與代碼判斷。
- 直接呼叫 Nothing 的方法:字串可能是
Nothing時,應先檢查。 - 大小寫比較不明確:需要忽略大小寫時,應明確指定
StringComparison。 - 誤以為 Replace 會改掉原字串:字串方法通常回傳新字串,需接住結果。
- 少量文字也硬用 StringBuilder:簡單顯示文字直接用
&即可。 - 切割後直接取索引:使用
Split後應先檢查陣列長度。
| 需求 | 建議做法 | 原因 |
|---|---|---|
| 檢查是否有輸入 | String.IsNullOrWhiteSpace |
可同時處理 Nothing、空字串與空白。 |
| 少量組合文字 | 使用 & |
簡單直覺,不需要額外物件。 |
| 大量逐行組合 | 使用 StringBuilder |
結構較清楚,也適合迴圈追加。 |
| 忽略大小寫比較 | String.Equals 搭配 StringComparison |
語意明確,避免隱性比較規則。 |
| 搜尋位置 | IndexOf |
可取得位置,也能判斷是否存在。 |
重點整理
String用來保存文字資料,可包含符號、空白與換行。- 字串可能是正常文字、空字串、空白文字或
Nothing。 - 處理表單輸入前,常需要先使用
Trim與String.IsNullOrWhiteSpace。 - 字串具有不可變性,
Replace、ToUpper等方法會回傳新字串。 - 比較文字時,應明確決定是否忽略大小寫。
IndexOf找不到文字時會回傳-1。Split後應先檢查陣列長度,再讀取指定位置。- 少量字串連接可使用
&,大量逐段追加可使用StringBuilder。