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:
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"
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čcefor
.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!
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, zdaInfo
je atribut použitInfoAttribute
proExample
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() { } }