@ (Referenční dokumentace jazyka C#)
@Speciální znak slouží jako doslovné identifikátor. Dá se použít následujícími způsoby:
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ázvemfor, který používá veforsmyč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!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.txtNá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"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, zdaInfoInfoAttributeje atribut nebo použit proExampletří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() { } }