在 C# 程式設計中,@ 符號雖然常見,但其雙重用途常被初學者忽略。正確理解並善用它,能讓程式碼更簡潔、可讀性更高,並解決跨語言互通的命名衝突。本文系統整理其兩大核心用法與注意事項。
當 @ 置於字串字面值之前,表示該字串為 逐字字串。編譯器會按字面意義解讀字串內容,不處理逸出序列。
// 傳統寫法
string path = "C:\\Program Files\\Microsoft.NET\\test.txt";
// 使用 @ 逐字字串
string path = @"C:\Program Files\Microsoft.NET\test.txt";
兩者編譯後的 IL 完全相同,但後者可讀性大幅提升。
逐字字串可直接跨越多行,極適合嵌入 SQL、JSON、JavaScript、XML 等結構化文本:
string sql = @"
SELECT Id, Name, Email
FROM Users
WHERE IsActive = 1
ORDER BY CreatedAt DESC;";
string json = @"
{
""name"": ""John"",
""age"": 30,
""skills"": [""C#"", ""SQL"", ""Azure""]
}";
注意:字串內的換行符會被保留,縮排空白也會成為字串一部分。
在逐字字串中,若需包含雙引號,需寫成兩個連續雙引號 "":
string msg = @"He said, ""Hello World!"""; // 實際內容:He said, "Hello World!"
@ 不能 用於變數或運算式:
string variable = "path";
// 錯誤:@variable // 無法編譯
// 正確:variable 本身已是字串,無需 @
C# 允許在識別符(類別名、方法名、參數名等)前加上 @,使其可使用保留關鍵字命名。此 @ 不屬於識別符名稱一部分,僅供編譯器辨識。
class @class
{
public static void @static(bool @bool)
{
if (@bool)
Console.WriteLine("true");
else
Console.WriteLine("false");
}
}
class Program
{
static void Main()
{
@class.@static(true); // 呼叫時也需加 @
}
}
Property 在 C# 非關鍵字,但若引用 VB 組件可能遇到衝突。event, object, params),加 @ 保持語義清晰。自 C# 11 起,引入 原始字串字面值,使用三個或更多雙引號 """" 包裹,無需 @ 即可實現多行、不逸出、任意引號內容:
string json = """
{
"name": "John",
"quote": "He said, \"Hello!\""
}
""";
此語法更直觀,建議新專案優先採用。
| 用法 | 語法 | 適用對象 | 核心優勢 |
|---|---|---|---|
| 逐字字串 | @"" | 字串常值 | 免逸出、支援多行、路徑可讀 |
| 關鍵字識別符 | @identifier | 類別/方法/參數/變數名 | 合法使用保留字、跨語言相容 |
Identifier expected; 'class' is a keyword」時,嘗試加 @ 前綴。@ 在識別符上不影響反射、序列化、IL 名稱,typeof(@class).Name 回傳仍為 "class"。