Partilhar via


Texto detalhado - @ em variáveis, atributos e literais de cadeia de caracteres

O @ caractere especial serve como um identificador literal. Utiliza-o das seguintes formas:

  1. Para indicar que um literal de cadeia de caracteres deve ser interpretado textualmente. O @ caractere neste caso define uma cadeia de caracteres literal literal. Sequências de escape simples (como "\\" para uma barra invertida), sequências de escape hexadecimais (como "\x0041" para um A maiúsculo) e sequências de escape Unicode (como "\u0041" para um A maiúsculo) são interpretadas literalmente. Apenas uma sequência de fuga de aspas ("") não é interpretada literalmente, ela produz uma aspa dupla. Além disso, no caso de uma chave de corda interpolada, as sequências de escape ({{ e }}) não são interpretadas literalmente, elas produzem caracteres de chave única. O exemplo a seguir define dois caminhos de arquivo idênticos, um usando um literal de cadeia de caracteres regular e o outro usando um literal de cadeia de caracteres literal. Este é um dos usos mais comuns de literais de cadeia de caracteres literais.

    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
    

    O exemplo a seguir ilustra o efeito da definição de um literal de cadeia de caracteres regular e um literal de cadeia de caracteres literal que contêm sequências de caracteres idênticas.

    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. Para usar palavras-chave C# como identificadores. O @ caractere prefixa um elemento de código que o compilador deve interpretar como um identificador em vez de uma palavra-chave C#. O exemplo a seguir usa o @ caractere para definir um identificador chamado for que ele usa em um 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. Para permitir que o compilador distinga entre atributos em casos de conflito de nomenclatura. Um atributo é uma classe que deriva de Attribute. Seu nome de tipo normalmente inclui o sufixo Atributo, embora o compilador não imponha essa convenção. O atributo pode então ser referenciado no código pelo seu nome de tipo completo (por exemplo, [InfoAttribute] ou pelo seu nome abreviado (por exemplo, [Info]). No entanto, um conflito de nomenclatura ocorre se dois nomes de tipo de atributo abreviados forem idênticos e um nome de tipo incluir o sufixo Atributo, mas o outro não. Por exemplo, o código a seguir falha ao compilar porque o compilador não pode determinar se o Info atributo or InfoAttribute é aplicado à Example classe. Para obter mais informações, consulte 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()
       {
       }
    }
    

Consulte também