Doslovný text – @ v proměnných, atributech a řetězcových literálech

Speciální @ znak slouží jako doslovný identifikátor. Používáte ho následujícími způsoby:

  1. Chcete-li označit, že řetězcový literál má být interpretován doslovně. Znak @ v této instanci definuje doslovný řetězcový literál. Jednoduché řídicí sekvence (například "\\" zpětné lomítko), šestnáctkové řídicí sekvence (například "\x0041" pro velká písmena A) a řídicí sekvence Unicode (například "\u0041" pro velká písmena A) se interpretují doslova. Pouze řídicí sekvence uvozovek ("") není interpretována doslova; vytváří jednu uvozovku. V případě doslovného interpolovaného řídicích sekvencí řetězců ({{ a }}) nejsou navíc interpretovány doslova; vytvářejí jednoduché složené znaky. Následující příklad definuje dvě identické cesty k souborům, jednu pomocí běžného řetězcového literálu a druhého pomocí doslovné řetězcové literálu. Toto je jedno z nejběžnějších použití doslovných řetězcových literálů.

    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
    

    Následující příklad ukazuje účinek definování regulárního řetězcového literálu a doslovného řetězcového literálu, který obsahuje identické sekvence znaků.

    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. Použití klíčových slov jazyka C# jako identifikátorů Znak @ předpony elementu kódu, který kompilátor interpretuje jako identifikátor, nikoli jako klíčové slovo jazyka C#. Následující příklad používá @ znak k definování identifikátoru, for který používá ve smyčce 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. Chcete-li kompilátoru umožnit rozlišovat mezi atributy v případech konfliktu pojmenování. Atribut je třída, která je odvozena od Attribute. Název jeho typu obvykle zahrnuje atribut přípony, i když kompilátor tuto konvenci nevynucuje. Na atribut se pak dá odkazovat v kódu buď úplným názvem typu (například [InfoAttribute] zkráceným názvem ). [Info] Ke konfliktu názvů však dochází, pokud jsou dva zkrácené názvy typů atributů identické a jeden název typu obsahuje příponu Atribut , ale druhá ne. Například následující kód se nepodaří zkompilovat, protože kompilátor nemůže určit, zda Info je atribut použit InfoAttribute pro Example třídu. Další informace najdete v tématu 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()
       {
       }
    }
    

Viz také