@ (C#-Referenz)@ (C# Reference)

Das Sonderzeichen @ dient als ausführlicher Bezeichner.The @ special character serves as a verbatim identifier. Er wird wie folgt verwendet:It can be used in the following ways:

  1. Zum Aktivieren von C#-Schlüsselwörtern, die als Bezeichner verwendet werden sollen.To enable C# keywords to be used as identifiers. Das Zeichen @ steht vor einem Codeelement, das der Compiler als Bezeichner und nicht als C#-Schlüsselwort interpretieren soll.The @ character prefixes a code element that the compiler is to interpret as an identifier rather than a C# keyword. Im folgenden Beispiel wird das Zeichen @ zum Definieren eines Bezeichners mit dem Namen for verwendet, der in einer for-Schleife verwendet wird.The following example uses the @ character to define an identifier named for that it uses in a for loop.

    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.To indicate that a string literal is to be interpreted verbatim. Das Zeichen @ in dieser Instanz definiert ein ausführliches Zeichenfolgenliteral.The @ character in this instance defines a verbatim string literal. 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.Simple escape sequences (such as "\\" for a backslash), hexadecimal escape sequences (such as "\x0041" for an uppercase A, and Unicode escape sequences, such as "\u0041" for an uppercase A, are interpreted literally. Nur eine Escapesequenz für Anführungszeichen ("") wird nicht wörtlich interpretiert; es wird ein einfaches Anführungszeichen generiert.Only a quote escape sequence ("") is not interpreted literally; it produces a single quotation mark. Im folgenden Beispiel werden zwei identische Dateipfade definiert – einer durch Verwendung eines regulären Zeichenfolgenliterals und der andere durch ein ausführliches Zeichenfolgenliteral.The following example defines two identical file paths, one by using a regular string literal and the other by using a verbatim string literal. Dies ist einer der häufigeren Verwendungsarten von ausführlichen Zeichenfolgenliteralen.This is one of the more common uses of verbatim string literals.

    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.The following example illustrates the effect of defining a regular string literal and a verbatim string literal that contain identical character sequences.

    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.To enable the compiler to distinguish between attributes in cases of a naming conflict. Ein Attribut ist ein von Attribute abgeleiteter Typ.An attribute is a type that derives from Attribute. Der Name des Typs enthält normalerweise das Suffix Attribute, obwohl der Compiler diese Konvention nicht erzwingt.Its type name typically includes the suffix Attribute, although the compiler does not enforce this convention. 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.The attribute can then be referenced in code either by its full type name (for example, [InfoAttribute] or its shortened name (for example, [Info]). 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.However, a naming conflict occurs if two shortened attribute type names are identical, and one type name includes the Attribute suffix but the other does not. 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.For example, the following code fails to compile because the compiler cannot determine whether the Info or InfoAttribute attribute is applied to the Main method.

    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.If the verbatim identifier is used to identify the Info attribute, the example compiles successfully.

    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 auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SonderzeichenC# Special Characters