首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# @ 符號完整指南:逐字字串與關鍵字識別符應用

     編輯:關於C語言

前言

在 C# 程式設計中,@ 符號雖然常見,但其雙重用途常被初學者忽略。正確理解並善用它,能讓程式碼更簡潔、可讀性更高,並解決跨語言互通的命名衝突。本文系統整理其兩大核心用法與注意事項。

用法一:逐字字串字面值

當 @ 置於字串字面值之前,表示該字串為 逐字字串。編譯器會按字面意義解讀字串內容,不處理逸出序列。

1. 檔案路徑不再需要雙反斜線

// 傳統寫法
string path = "C:\\Program Files\\Microsoft.NET\\test.txt";

// 使用 @ 逐字字串
string path = @"C:\Program Files\Microsoft.NET\test.txt";

兩者編譯後的 IL 完全相同,但後者可讀性大幅提升。

2. 多行字串原生支援

逐字字串可直接跨越多行,極適合嵌入 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""]
}";

注意:字串內的換行符會被保留,縮排空白也會成為字串一部分。

3. 雙引號逸出規則

在逐字字串中,若需包含雙引號,需寫成兩個連續雙引號 "":

string msg = @"He said, ""Hello World!"""; // 實際內容:He said, "Hello World!"

⚠ 限制:僅限字串常值

@ 不能 用於變數或運算式:

string variable = "path";
// 錯誤:@variable  // 無法編譯
// 正確:variable 本身已是字串,無需 @

用法二:關鍵字作為識別符

C# 允許在識別符(類別名、方法名、參數名等)前加上 @,使其可使用保留關鍵字命名。此 @ 不屬於識別符名稱一部分,僅供編譯器辨識。

範例:定義名為 class 的類別與 static 方法

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); // 呼叫時也需加 @
    }
}

實務應用場景

  • 跨語言互通:某語言的關鍵字在 C# 非保留字,或反之。例如 VB.NET 的 Property 在 C# 非關鍵字,但若引用 VB 組件可能遇到衝突。
  • 代碼生成工具:自動產生的代碼可能不經意使用關鍵字做名稱,加 @ 可避免編譯錯誤。
  • 領域模型命名:業務術語恰好是關鍵字(如 event, object, params),加 @ 保持語義清晰。

進階補充:C# 11 原始字串字面值

自 C# 11 起,引入 原始字串字面值,使用三個或更多雙引號 """" 包裹,無需 @ 即可實現多行、不逸出、任意引號內容:

string json = """
{
  "name": "John",
  "quote": "He said, \"Hello!\""
}
""";

此語法更直觀,建議新專案優先採用。

總結對照表

用法語法適用對象核心優勢
逐字字串@""字串常值免逸出、支援多行、路徑可讀
關鍵字識別符@identifier類別/方法/參數/變數名合法使用保留字、跨語言相容

最佳實踐建議

  1. 檔案路徑、正則運算式、多行 SQL/JSON 優先使用 @ 逐字字串(或 C# 11 原始字串)。
  2. 遇到編譯錯誤「Identifier expected; 'class' is a keyword」時,嘗試加 @ 前綴。
  3. 團隊制定編碼規範:識別符加 @ 僅作為最後手段,優先選擇非關鍵字命名。
  4. 記住:@ 在識別符上不影響反射、序列化、IL 名稱,typeof(@class).Name 回傳仍為 "class"。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved