char vs string 核心差異
| 特性 | char (System.Char) | string (System.String) |
| 型別分類 | 實值型別 (struct) | 參考型別 (class) |
| 大小 | 2 bytes (UTF-16 code unit) | 動態 (20+2n bytes) |
| 不可變性 | N/A (單一值) | 是 (操作產生新字串) |
| Null 能力 | 不可為 null | 可為 null |
| 字面常值 | 'A' | "Hello" |
| 索引存取 | N/A | s[i] 唯讀傳回 char |
字元分類與 Unicode 類別
char c = '中';
char.IsDigit(c); // false
char.IsLetter(c); // true
char.IsLetterOrDigit(c);
char.IsUpper(c);
char.IsLower(c);
char.IsWhiteSpace(c);
char.IsControl(c);
char.IsPunctuation(c);
char.IsSymbol(c);
char.GetUnicodeCategory(c); // UnicodeCategory.OtherLetter
字串核心操作 API
| 分類 | 方法 | 說明 |
| 查詢 | IndexOf/LastIndexOf | 子字串/字元位置 |
| Contains/StartsWith/EndsWith | 存在/前綴/後綴檢查 |
| Compare/CompareTo/Equals | 序數/文化特性比較 |
| Substring | 擷取子字串 (新配置) |
| 轉換 | ToUpper/ToLower/ToUpperInvariant | 大小寫轉換 |
| Trim/TrimStart/TrimEnd | 移除首尾空白/指定字元 |
| Replace | 取代 (全域、不支援 Regex) |
| Insert/Remove | 插入/移除指定位置 |
| 分割/合併 | Split | 分割為陣列 |
| Join | 合併陣列/集合 |
| Concat | 連接多字串 |
| 格式化 | Format | 複合格式 |
| 插值 $"" | 現代語法糖 |
高效能字串操作 (Span/Memory)
// 傳統 Substring 配置新字串
string sub = longString.Substring(10, 20);
// Span 切片:零配置、堆疊分配 (C# 7.2+)
ReadOnlySpan slice = longString.AsSpan(10, 20);
// 可直接傳遞給接受 Span 的 API (如 int.TryParse)
// StringBuilder 批次建構
var sb = new StringBuilder(1024);
for (int i = 0; i < 1000; i++) sb.AppendLine(i.ToString());
string result = sb.ToString();
// String.Create (C# 9+) 直接寫入緩衝區
string created = String.Create(10, 42, (span, seed) => {
for (int i = 0; i < 10; i++) span[i] = (char)('A' + (seed + i) % 26);
});
字串比較最佳實務
// 序數比較 (快速、區分大小寫、適合識別碼/路徑/內部邏輯)
str1.Equals(str2, StringComparison.Ordinal);
str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
// 文化特性比較 (使用者顯示、排序)
str1.Equals(str2, StringComparison.CurrentCulture);
str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase);
// 固定文化特性 (序列化、日誌、協定)
str1.Equals(str2, StringComparison.InvariantCulture);
// 避免預設 Equals/== (使用 CurrentCulture,行為隨系統語系變動)
常見效能陷阱
- 迴圈中
s += x → 用 StringBuilder 或 String.Create
- 大量
Substring → 用 Span 切片
ToUpper() 比較 → 用 OrdinalIgnoreCase
- 字串插值格式化熱路徑 → 考慮
DefaultInterpolatedStringHandler 自訂




本文對應《叩響 C# 之門》第 2.3 節字符和字符串教學內容