@ (Referenční dokumentace jazyka C#)

@Speciální znak slouží jako doslovné identifikátor. Dá se použít následujícími způsoby:

  1. Aby bylo možné použít klíčová slova jazyka C# jako identifikátory. @Znak prefixuje prvek kódu, který kompilátor interpretuje jako identifikátor spíše než klíčové slovo jazyka C#. Následující příklad používá @ znak k definování identifikátoru s názvem for , který používá ve for smyčce.

    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!
    
  2. Pro indikaci, že řetězcový literál má být interpretován jako doslovné. @Znak v této instanci definuje doslovné řetězcový literál. Jednoduché řídicí sekvence (například pro "\\" zpětné lomítko), šestnáctkové řídicí sekvence (například "\x0041" pro velké písmeno a) a řídicí sekvence Unicode (například "\u0041" pro velké písmeno a) jsou interpretovány doslova. Pouze řídicí sekvence uvozovky ( "" ) nejsou interpretovány doslova; vytvoří jeden znak dvojité uvozovky. Kromě toho nejsou v případě doslovnéch znakových sekvencí (a) kulaté závorky řetězcové závorky {{ }} interpretovány doslova; vytvoří jednoduché znaky složené závorky. Následující příklad definuje dvě totožné cesty k souboru, jeden pomocí regulárního řetězcového literálu a druhý pomocí doslovného řetězcového literálu. Toto je jedno z častý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 znázorňuje úč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"
    
  3. Aby kompilátor mohl v případě konfliktu pojmenování rozlišovat mezi atributy. Atribut je třída, která je odvozena z Attribute . Název jeho typu obvykle obsahuje atribut přípony, i když kompilátor vynutil tuto konvenci. Atribut pak může být odkazován v kódu buď jeho úplným názvem typu (například [InfoAttribute] nebo jeho zkráceným názvem (například [Info] ). Konflikt pojmenování nastane, pokud jsou dva zkrácené názvy typů atributů identické a jeden název typu zahrnuje příponu atributu , ale druhá ne. Například následující kód se nepodaří zkompilovat, protože kompilátor nemůže určit, zda Info InfoAttribute je atribut nebo použit 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é