三種語法對比
| 語法 | 名稱 | 特點 | 轉義 | 插值 |
"abc" | 普通字符串 | 需轉義 `\n` `\t` `\"` `\\` | 支援 | 不支援(需 `String.Format`) |
@"abc" | 逐字字符串 | 原樣輸出,換行、反斜桿無需轉義,雙引號寫 `""` | 不支援(除 `""`) | 不支援 |
$"abc" | 插值字符串 | 編譯期轉為 `String.Format`,大括號內直接寫變量/表達式 | 支援 `\n` 等 | **原生支援** |
實戰對比
string name = "Jack"; int age = 20;
// 1. 普通 + Format
string s1 = String.Format("Name: {0}\nAge: {1}", name, age);
// 2. 逐字 + Format(多行文本友好)
string s2 = String.Format(@"Name: {0}
Age: {1}", name, age);
// 3. 插值(最推薦,可讀、效能好、智能提示全)
string s3 = $"Name: {name}\nAge: {age}";
// 進階:格式化、條件、對齊
string s4 = $"Name: {name,10} | Age: {age:D3} | Adult: {(age>=18 ? \"Yes\" : \"No\")}";
編譯原理
- `$""` 編譯為 `String.Format` 呼叫,零運行時解析開銷。
- 逐字字符串 `@""` 編譯為帶換行的常量,適合 SQL、JSON、正則、多行文本模板。
最佳實踐
- 單行、需插值 → **`$""`**。
- 多行、含大量反斜桿/引號、無插值 → **`@""`**。
- 需編譯期常量(屬性參數、switch case) → 僅能用普通/逐字字符串,`$""` 非常量。