string str = "Hello World";
char[] chars = str.ToCharArray(); // 全部字元
char[] sub = str.ToCharArray(2, 3); // 從索引 2 取 3 個字元 ('l','l','o')
// 存取單一字元 (無需轉陣列)
char c = str[2]; // 'l'
char c2 = str[^1]; // 最後一個字元 (C# 8 索引運算子)
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string s1 = new string(chars); // 全部
string s2 = new string(chars, 1, 3); // 從索引 1 取 3 個 -> "ell"
string s3 = new string('*', 10); // 重複字元 -> "**********"
string s4 = new string(chars, 0, chars.Length); // 等同 s1
var sb = new StringBuilder();
sb.Append('H').Append('e').Append("llo");
sb.Append(chars, 0, chars.Length);
string result = sb.ToString();
char[] buffer = new char[100];
int len = ReadIntoBuffer(buffer); // 假設讀取 10 字元
ReadOnlySpan slice = buffer.AsSpan(0, len); // 無配置、無複製
string s = slice.ToString(); // 需要字串時才配置
// 或直接處理 Span (搜尋、比較、解析)
int idx = slice.IndexOf('e');
string text = "中文測試";
byte[] utf8 = Encoding.UTF8.GetBytes(text);
byte[] big5 = Encoding.GetEncoding("big5").GetBytes(text);
string back = Encoding.UTF8.GetString(utf8);
// 串流式編碼/解碼 (大資料)
using var ms = new MemoryStream();
using (var writer = new StreamWriter(ms, Encoding.UTF8, leaveOpen: true))
writer.Write(text);
byte[] data = ms.ToArray();
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
string s = chars.ToString(); | 回傳型別名稱 "System.Char[]" | new string(chars) |
char c = str[5]; (長度 5) | IndexOutOfRangeException | 先檢查 str.Length > 5 |
修改字串字元 str[0] = 'a'; | 字串不可變,編譯錯誤 | 用 StringBuilder 或 char[] 修改後 new string() |
| 假設 char 為 1 byte | C# char 為 UTF-16 (2 bytes),補字元佔 2 char | 處理 Unicode 時使用 StringInfo 或 Rune (C# 8+) |
StringBuilder。Span<char> / MemoryExtensions 零複製操作。string.Create (C# 9+,配合 delegate 直接寫入緩衝區)。ToCharArray() 後又 new string() 往返,除非必要。掌握字串與字元陣列的轉換、切片、編碼操作,即能高效處理文字資料。