Teilen über


Verbatim-Text – @ in Variablen, Attributen und Zeichenfolgenliteralen

Das @ Sonderzeichen dient als Verbatimbezeichner. Sie verwenden es auf folgende Weise:

  1. Um anzugeben, dass ein Zeichenfolgenliteral verbatim interpretiert werden soll. Das @ Zeichen in dieser Instanz definiert ein Verbatim-Zeichenfolgenliteral. Einfache Escapesequenzen (z "\\" . B. für einen umgekehrten Schrägstrich), hexadezimale Escapesequenzen (z "\x0041" . B. für großgeschriebene A) und Unicode-Escapesequenzen (z "\u0041" . B. für einen Großbuchstaben A) werden buchstäblich interpretiert. Nur eine Anführungszeichen-Escapesequenz ("") wird nicht wörtlich interpretiert; es erzeugt ein doppeltes Anführungszeichen. Darüber hinaus werden bei interpolierten Zeichenfolgenklammern escapesequenzen ({{ und }}) nicht wörtlich interpretiert; sie erzeugen einzelne geschweifte Zeichen. Im folgenden Beispiel werden zwei identische Dateipfade definiert, eine mithilfe eines regulären Zeichenfolgenliterals und des anderen mithilfe eines Verbatim-Zeichenfolgenliterals. Dies ist eine der häufigsten Verwendungen von Verbatim-Zeichenfolgenliteralen.

    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
    

    Das folgende Beispiel veranschaulicht den Effekt der Definition eines regulären Zeichenfolgenliterals und eines verbatimischen Zeichenfolgenliterals, das identische Zeichensequenzen enthält.

    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. So verwenden Sie C#-Schlüsselwörter als Bezeichner. Das @ Zeichen präfixiert ein Codeelement, das der Compiler als Bezeichner anstelle eines C#-Schlüsselworts interpretiert. Im folgenden Beispiel wird das @ Zeichen verwendet, um einen Bezeichner zu definieren, der in einer for Schleife verwendet for 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!
    
  3. Um dem Compiler die Unterscheidung zwischen Attributen in Fällen eines Namenskonflikts zu ermöglichen. Ein Attribut ist eine Klasse, die von Attribute. Der Typname enthält in der Regel das Suffix-Attribut, obwohl der Compiler diese Konvention nicht erzwingt. Das Attribut kann dann im Code entweder durch den vollständigen Typnamen (z [InfoAttribute] . B. oder den gekürzten Namen) [Info]referenziert werden. Ein Namenskonflikt tritt jedoch auf, wenn zwei gekürzte Attributtypnamen identisch sind, und ein Typname das Attributsuffix enthält, die andere jedoch nicht. Der folgende Code kann z. B. nicht kompiliert werden, da der Compiler nicht bestimmen kann, ob das Attribut oder InfoAttribute das Info Attribut auf die Example Klasse angewendet wird. Weitere Informationen finden Sie unter 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()
       {
       }
    }
    

Siehe auch