string(System.String)是 不可變 的引用類型。每次「修改」實際都會在托管堆上分配新物件,舊物件等待 GC 回收。高頻拼接場景必須使用 StringBuilder。
// 字面量(推薦)
string s1 = "Hello";
string s2 = @"C:\Path\To\File"; // 逐字字面量,不轉義
string s3 = $"{DateTime.Now:yyyy-MM-dd}"; // 字串插值
// 建構函式
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string s4 = new string(chars);
string s5 = new string('*', 10); // 重複字符
| 方法 | 用途 | 回傳 | 備註 |
|---|---|---|---|
CompareTo(str) | 序數比較 | int (-1/0/1) | 區分大小寫;序數比較非文化敏感 |
Equals(str, StringComparison) | 相等判斷 | bool | 推薦用 OrdinalIgnoreCase |
IndexOf/LastIndexOf | 查找位置 | int | 支援 StringComparison 參數 |
StartsWith/EndsWith | 前綴/後綴 | bool | 同上 |
Substring(start, len?) | 截取子串 | string | 超出範圍拋異常 |
Split(separator, options) | 分割 | string[] | RemoveEmptyEntries 常用 |
Join(sep, arr) | 連接陣列 | string | 靜態方法 |
Trim/TrimStart/TrimEnd | 移除空白 | string | 可傳入字符陣列自定義 |
ToUpper/ToLower | 大小寫轉換 | string | 指定 CultureInfo 避免土耳其語問題 |
Replace(old, new) | 替換 | string | 全域替換,不可變 |
ToCharArray() | 轉字符陣列 | char[] | 可修改後重建字串 |
var sb = new StringBuilder("初始", 100); // 預分配容量
sb.Append("內容");
sb.AppendFormat("格式化 {0:N2}", 1234.5);
sb.Insert(0, "前綴_");
sb.Remove(5, 3);
sb.Replace('舊', '新');
string result = sb.ToString(); // 單次分配
效能基準: 循環 10 萬次拼接,StringBuilder 約快 1000 倍且零 Gen2 GC。
using System.Text.RegularExpressions;
var pattern = @"^\d{4}-\d{2}-\d{2}$"; // 日期格式
var input = "2024-01-15";
// 1. 單次匹配
bool valid = Regex.IsMatch(input, pattern);
// 2. 提取分組
var match = Regex.Match(input, @"(\d{4})-(\d{2})");
if (match.Success) {
var year = match.Groups[1].Value;
var month = match.Groups[2].Value;
}
// 3. 替換
string masked = Regex.Replace("身份證 A123456789", @"\w\d{9}", "***隱藏***");
// 4. 分割(支援正則分隔符)
string[] parts = Regex.Split("a,b;c|d", @"[,;|]");
// 編譯選項:RegexOptions.Compiled 提升重複使用效能
var regex = new Regex(pattern, RegexOptions.Compiled);
| 格式 | 說明 | 範例 (1234.56) |
|---|---|---|
| C / c | 貨幣 | ¥1,234.56 |
| D / d | 十進制整數 | 1235 (四捨五入) |
| E / e | 科學記號 | 1.234560E+003 |
| F / f | 固定小數位 | 1234.56 |
| N / n | 千分位 | 1,234.56 |
| P / p | 百分比 | 123,456.00% |
| X / x | 十六進制 | 4D2 |
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 2024-01-15 14:30:45.123
DateTime.Now.ToString("yyyy年M月d日 dddd", new CultureInfo("zh-TW")); // 2024年1月15日 星期一
var name = "張三";
var score = 98.5;
var msg = $"學生 {name} 得分 {score:N1} 分,等級 {(score >= 90 ? "優" : "良")}";
// 輸出
Console.WriteLine("帶換行");
Console.Write("不換行");
// 格式化輸出
Console.WriteLine("姓名:{0,-10} 年齡:{1,3}", "李四", 25);
// 輸入
Console.Write("請輸入姓名:");
string input = Console.ReadLine()?.Trim() ?? "";
// 安全解析數值
if (int.TryParse(Console.ReadLine(), out int age)) { ... }
string ip = "192.168.1.100";
// 分割
var segments = ip.Split('.');
// 驗證
bool valid = segments.Length == 4 && segments.All(s => byte.TryParse(s, out _));
// 重組
string dotted = string.Join(".", segments);
string spaced = string.Join(" ", segments); // 192 168 1 100
StringComparison.OrdinalIgnoreCase。string.IsNullOrEmpty() / IsNullOrWhiteSpace()。+ 拼接 → 改 StringBuilder 或 string.Concat。Encoding.UTF8,避免預設編碼差異。熟練掌握 string 不可變特性、StringBuilder 高效構建、正則強大匹配、格式化靈活輸出,是 C# 開發者處理文本數據的核心功力。選對工具,事半功倍。