@ (C#-Referenz)

Das Sonderzeichen @ dient als ausführlicher Bezeichner. Er wird wie folgt verwendet:

  1. Zum Aktivieren von C#-Schlüsselwörtern, die als Bezeichner verwendet werden sollen. Das Zeichen @ steht vor einem Codeelement, das der Compiler als Bezeichner und nicht als C#-Schlüsselwort interpretieren soll. Im folgenden Beispiel wird das Zeichen @ zum Definieren eines Bezeichners mit dem Namen for verwendet, der in einer for-Schleife verwendet wird.

    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. Zum Angeben, dass ein Zeichenfolgenliteral wörtlich interpretiert werden soll. Das Zeichen @ in dieser Instanz definiert ein ausführliches Zeichenfolgenliteral. Einfache Escapesequenzen (z.B. "\\" für einen umgekehrten Schrägstrich), Escapesequenzen für Hexadezimalzahlen (z.B. "\x0041" für ein groß geschriebenes A) und Escapesequenzen für Unicodezeichen (wie z.B. "\u0041" für ein groß geschriebenes A) werden wörtlich interpretiert. Nur eine Escapesequenz für Anführungszeichen ("") wird nicht wörtlich interpretiert; es wird ein einfaches Anführungszeichen generiert. Im folgenden Beispiel werden zwei identische Dateipfade definiert – einer durch Verwendung eines regulären Zeichenfolgenliterals und der andere durch ein ausführliches Zeichenfolgenliteral. Dies ist einer der häufigeren Verwendungsarten von ausführlichen Zeichenfolgenliteralen.

    string filename1 = @"c:\documents\files\u0066.txt";
    string filename2 = "c:\\documents\\files\\u0066.txt";
    
    Console.WriteLine(filename1);
    Console.WriteLine(filename2);
    

    Im folgenden Beispiel werden die Auswirkungen des Definierens eines regulären Zeichenfolgenliterals und eines ausführlichen Zeichenfolgenliterals mit identischen Zeichensequenzen dargestellt.

    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. Zum Zulassen, dass der Compiler im Fall eines Namenskonflikts zwischen Attributen unterscheiden kann. Ein Attribut ist ein von Attribute abgeleiteter Typ. Der Name des Typs enthält normalerweise das Suffix Attribute, obwohl der Compiler diese Konvention nicht erzwingt. Auf das Attribut kann dann im Code entweder über den vollständigen Typnamen (z.B. [InfoAttribute]) oder über den gekürzten Namen (z.B. [Info]) verwiesen werden. Allerdings tritt ein Namenskonflikt auf, wenn zwei gekürzte Typnamen des Attributs identisch sind und ein Typname das Suffix Attribute enthält, der andere jedoch nicht. Der folgende Code kann z.B. nicht kompiliert werden, da der Compiler nicht bestimmen kann, ob das Attribut Info oder InfoAttribute auf die Methode Main angewendet wird.

    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.")]
    public class Example
    {
       [InfoAttribute("The entry point.")]
       public static void Main()
       {
       }
    }
    

    Wenn der ausführliche Bezeichner zum Identifizieren des Attributs Info verwendet wird, kann das Beispiel erfolgreich kompiliert werden.

    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.")]
    public class Example
    {
       [InfoAttribute("The entry point.")]
       public static void Main()
       {
       }
    }
    

Siehe auch

C#-Referenz
C#-Programmierhandbuch
C# Special Characters (C#-Sonderzeichen)