變數、屬性和字串常值中的逐字文字 - @

@ 特殊字元可用為逐字識別項。 您可以將其用於下列方面:

  1. 表示要逐字解譯字串常值。 這個執行個體中的 @ 字元會定義「逐字字串常值」。 簡單逸出序列 (例如 "\\" 用於反斜線)、十六進位逸出序列 (例如 "\x0041" 用於大寫 A),以及 Unicode 逸出序列 (例如 "\u0041" 用於大寫 A) 都是照字面解譯。 只有引號逸出序列 ("") 不照字面解譯,其會產生一個雙引號。 此外,如果是逐字插補字串,大括弧逸出序列 ({{}}) 不會照字面意義解譯,其會產生一個大括弧字元。 下例會定義兩個相同的檔案路徑,一個使用規則字串常值,另一個使用逐字字串常值。 這是逐字字串常值較常見的用法之一。

    string filename1 = @"c:\documents\files\u0066.txt";
    string filename2 = "c:\\documents\\files\\u0066.txt";
    
    Console.WriteLine(filename1);
    Console.WriteLine(filename2);
    // The example displays the following output:
    //     c:\documents\files\u0066.txt
    //     c:\documents\files\u0066.txt
    

    下例示範定義包含相同字元序列的規則字串常值和逐字字串常值的效果。

    string s1 = "He said, \"This is the last \u0063hance\x0021\"";
    string s2 = @"He said, ""This is the last \u0063hance\x0021""";
    
    Console.WriteLine(s1);
    Console.WriteLine(s2);
    // The example displays the following output:
    //     He said, "This is the last chance!"
    //     He said, "This is the last \u0063hance\x0021"
    
  2. 若要使用 C# 關鍵字作為識別碼。 @ 字元將程式碼元素當成前置詞,編譯器要將此元素解譯為識別項,不是 C# 關鍵字。 下例會使用 @ 字元來定義名為 for 的識別項,它會用在 for 迴圈中。

    string[] @for = { "John", "James", "Joan", "Jamie" };
    for (int ctr = 0; ctr < @for.Length; ctr++)
    {
       Console.WriteLine($"Here is your gift, {@for[ctr]}!");
    }
    // The example displays the following output:
    //     Here is your gift, John!
    //     Here is your gift, James!
    //     Here is your gift, Joan!
    //     Here is your gift, Jamie!
    
  3. 如果發生命名衝突,讓編譯器區別屬性。 屬性是衍生自 Attribute 的類別。 雖然編譯器不會強制執行此慣例,但其型別名稱通常會包含尾碼 Attribute。 然後,在程式碼中就可以依其完整型別名稱 (例如 [InfoAttribute]) 或簡短名稱 (例如 [Info]) 參考屬性。 不過,如果兩個簡短的屬性型別名稱完全相同,但一個型別名稱有 Attribute 尾碼,一個沒有,即會發生命名衝突。 例如,下列程式碼無法編譯,因為編譯器無法判斷是否已對 Example 類別套用了 InfoInfoAttribute 屬性。 請參閱 CS1614 以取得詳細資訊。

    using System;
    
    [AttributeUsage(AttributeTargets.Class)]
    public class Info : Attribute
    {
       private string information;
    
       public Info(string info)
       {
          information = info;
       }
    }
    
    [AttributeUsage(AttributeTargets.Method)]
    public class InfoAttribute : Attribute
    {
       private string information;
    
       public InfoAttribute(string info)
       {
          information = info;
       }
    }
    
    [Info("A simple executable.")] // Generates compiler error CS1614. Ambiguous Info and InfoAttribute.
    // Prepend '@' to select 'Info' ([@Info("A simple executable.")]). Specify the full name 'InfoAttribute' to select it.
    public class Example
    {
       [InfoAttribute("The entry point.")]
       public static void Main()
       {
       }
    }
    

另請參閱