Tekst dosłowny — @
w zmiennych, atrybutach i literałach ciągu
Znak @
specjalny służy jako identyfikator dosłowny. Można go używać w następujący sposób:
Aby wskazać, że literał ciągu ma być interpretowany dosłownie. Znak
@
w tym wystąpieniu definiuje literał ciągu dosłownego. Proste sekwencje ucieczki (takie jak"\\"
ukośnik odwrotny), sekwencje ucieczki szesnastkowe (na przykład"\x0041"
dla wielkich liter A) i sekwencje ucieczki Unicode (takie jak"\u0041"
wielkie litery A) są interpretowane dosłownie. Tylko sekwencja ucieczki cudzysłowu (""
) nie jest interpretowana dosłownie; tworzy jeden podwójny cudzysłów. Ponadto w przypadku dosłownych sekwencjach ucieczki nawiasów klamrowych ciągów ({{
i}}
) nie są interpretowane dosłownie; tworzą one pojedyncze znaki nawiasu klamrowego. W poniższym przykładzie zdefiniowano dwie identyczne ścieżki plików, jedną przy użyciu zwykłego literału ciągu i drugiego przy użyciu literału ciągu dosłownego. Jest to jedno z bardziej typowych zastosowań literałów ciągów dosłownych.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
Poniższy przykład ilustruje efekt definiowania zwykłego literału ciągu i literału ciągu dosłownego, który zawiera identyczne sekwencje znaków.
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 użyć słów kluczowych języka C# jako identyfikatorów. Prefiksy
@
znaków element kodu, który kompilator ma interpretować jako identyfikator, a nie słowo kluczowe języka C#. W poniższym przykładzie użyto@
znaku do zdefiniowania identyfikatora o nazwiefor
używanegofor
w pętli.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!
Aby umożliwić kompilatorowi rozróżnienie atrybutów w przypadkach konfliktu nazewnictwa. Atrybut to klasa, która pochodzi z klasy Attribute. Jego nazwa typu zazwyczaj zawiera sufiks Atrybut, chociaż kompilator nie wymusza tej konwencji. Atrybut może być następnie przywoływane w kodzie za pomocą pełnej nazwy typu (na przykład
[InfoAttribute]
lub skróconej nazwy (na przykład[Info]
). Jednak konflikt nazewnictwa występuje, jeśli dwie skrócone nazwy typów atrybutów są identyczne, a jedna nazwa typu zawiera sufiks Atrybut , ale drugi nie. Na przykład następujący kod nie może skompilować, ponieważ kompilator nie może określić, czyInfo
atrybut lubInfoAttribute
jest stosowany doExample
klasy. Aby uzyskać więcej informacji, zobacz 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() { } }