Dela via


Ordagrann text – @ i variabler, attribut och strängliteraler

Specialtecknet @ fungerar som en ordagrann identifierare. Du använder det på följande sätt:

  1. För att indikera att en strängliteral ska tolkas ordagrant. Tecknet @ i den här instansen definierar en ordagrann strängliteral. Enkla escape-sekvenser (till exempel "\\" för ett omvänt snedstreck), hexadecimala escape-sekvenser (till exempel "\x0041" för versaler A) och Unicode-escape-sekvenser (till exempel "\u0041" för versaler A) tolkas bokstavligen. Endast en escape-sekvens för citattecken ("") tolkas inte bokstavligen. Den ger ett dubbelt citattecken. I händelse av en ordagrant interpolerad sträng klammerparentes escape sekvenser ({{ och }}) tolkas inte bokstavligen, de producerar enstaka klammerparenteser tecken. I följande exempel definieras två identiska filsökvägar, en med hjälp av en vanlig strängliteral och den andra med hjälp av en ordagrann strängliteral. Detta är en av de vanligaste användningsområdena för ordagranna strängliteraler.

    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
    

    I följande exempel visas effekten av att definiera en vanlig strängliteral och en ordagrann strängliteral som innehåller identiska teckensekvenser.

    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. Så här använder du C#-nyckelord som identifierare. Tecknet @ prefixar ett kodelement som kompilatorn ska tolka som en identifierare i stället för ett C#-nyckelord. I följande exempel används @ tecknet för att definiera en identifierare med namnet for som används i en 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!
    
  3. För att göra det möjligt för kompilatorn att skilja mellan attribut i händelse av en namngivningskonflikt. Ett attribut är en klass som härleds från Attribute. Dess typnamn innehåller vanligtvis suffixattributet, även om kompilatorn inte tillämpar den här konventionen. Attributet kan sedan refereras till i koden antingen med dess fullständiga typnamn (till exempel [InfoAttribute] eller dess förkortade namn (till exempel [Info]). En namngivningskonflikt uppstår dock om två förkortade attributtypnamn är identiska och ett typnamn innehåller attributets suffix, men det andra inte. Följande kod kan till exempel inte kompileras eftersom kompilatorn inte kan avgöra om Info attributet eller InfoAttribute tillämpas på Example klassen. Mer information finns i 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()
       {
       }
    }
    

Se även