在 C# 程式設計中,@ 符號有兩種截然不同的用途:一是用於字串字面值前,表示「逐字字串」;二是用於識別碼前,允許使用 C# 關鍵字作為變數名稱。許多開發者容易混淆這兩者,導致程式行為不如預期。本文透過實際程式碼範例,詳細剖析兩者的差異與正確用法。
當 @ 放在字串字面值之前(如 @"\a"),它會告訴編譯器這是一個逐字字串。在逐字字串中,逸出序列不會被解析,反斜線 \ 就是單純的反斜線字元。相反地,一般字串 "\a" 會將 \a 視為逸出序列(雖然 \a 在 C# 中並非標準逸出字元,編譯器會發出警告)。
當 @ 放在參數或變數名稱前(如 string @str),它的作用是讓該識別碼可以使用 C# 保留字。例如 int @class = 1; 是合法的,而 int class = 1; 則會編譯錯誤。這在與其他語言互通或使用程式碼產生工具時很實用。
以下程式碼在 ASP.NET 環境下執行,展示四種組合情況:
protected void Page_Load(object sender, EventArgs e)
{
test1("\a");
test1(@"\a");
test2("\a");
test2(@"\a");
test3("\a");
test3(@"\a");
test4("\a");
test4(@"\a");
}
// 參數無 @,呼叫無 @
public void test1(string str)
{
Response.Write("test1:[" + str + "]<br/>");
}
// 參數無 @,呼叫有 @
public void test2(string str)
{
Response.Write("test2:[" + @str + "]<br/>");
}
// 參數有 @,呼叫無 @
public void test3(string @str)
{
Response.Write("test3:[" + str + "]<br/>");
}
// 參數有 @,呼叫有 @
public void test4(string @str)
{
Response.Write("test4:[" + @str + "]<br/>");
}
執行後會發現:
"\a" 輸出 \a(編譯器警告無法辨識的逸出序列,保留原樣);輸入 @"\a" 輸出 \a。@str 在輸出時並不改變字串內容,@ 這裡只是多餘的前綴,結果同 test1。@str,但在方法內部使用時仍寫 str,行為同 test1。@,結果無異。結論:@ 在字串字面值前影響逸出序列解析;在識別碼前僅允許使用關鍵字作為名稱,不影響字串內容。兩者用途完全不同,切勿混淆。
