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:

  1. 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"
    
  2. 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 nazwie for używanego for 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!
    
  3. 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ć, czy Info atrybut lub InfoAttribute jest stosowany do Example 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()
       {
       }
    }
    

Zobacz też