Qual é o uso/significado do caractere @ em nomes de variáveis em C#?




web api project naming convention (8)

Em C #, o caractere at (@) é usado para denotar literais que explicitamente não aderem às regras relevantes na especificação de idioma.

Especificamente, ele pode ser usado para nomes de variáveis ​​que entram em conflito com palavras-chave reservadas (por exemplo, você não pode usar params, mas pode usar @params, mesmo com out / ref / qualquer outra palavra-chave na especificação de idioma). Além disso, ele pode ser usado para literais de string sem escape; isso é particularmente relevante com constantes de caminho, por exemplo, em vez de path = "c:\\temp\\somefile.txt" você pode escrever path = @"c:\temp\somefile.txt" . Também é muito útil para expressões regulares.

Descobri que você pode iniciar o nome da variável com um caractere '@' em C #. No meu projeto c # eu estava usando um serviço da web (eu adicionei uma referência da web para o meu projeto) que foi escrito em Java. Um dos objetos de interface definidos no WSDL tinha uma variável de membro com o nome "params". Obviamente, esta é uma palavra reservada em C #, então você não pode ter uma classe com uma variável de membro com o nome "params". O objeto proxy que foi gerado continha uma propriedade semelhante a esta:

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

Eu procurei pela documentação do VS 2008 c #, mas não consegui encontrar nada sobre isso. Também pesquisando no Google não me deu nenhuma resposta útil. Então, qual é o significado exato ou o uso do caractere '@' em um nome de variável / propriedade?


Diretamente da especificação da linguagem C # , identificadores (C #) :

O prefixo "@" permite o uso de palavras-chave como identificadores, o que é útil na interface com outras linguagens de programação. O caractere @ não faz parte do identificador, portanto, o identificador pode ser visto em outros idiomas como um identificador normal, sem o prefixo. Um identificador com um prefixo @ é chamado de identificador integral.


Se usarmos uma palavra-chave como o nome de um identificador, obtemos um erro do compilador "identificador esperado, 'Nome do identificador' é uma palavra-chave" Para superar esse erro, prefixar o identificador com "@". Esses identificadores são identificadores verbais. O caractere @ não faz parte do identificador, portanto, o identificador pode ser visto em outros idiomas como um identificador normal, sem o prefixo


Ele simplesmente permite que você use palavras reservadas como nomes de variáveis. Eu queria um var chamado event no outro dia. Eu estava indo com _event vez disso, mas meu colega me lembrou que eu poderia chamá-lo @event vez.


Outro caso de uso está nos métodos de extensão. O primeiro parâmetro especial pode ser distinguido para denotar seu significado real com @this name. Um exemplo:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

Você pode usá-lo para usar as palavras-chave reservadas como nome de variável como

 int @int = 3; 

o compilador irá ignorar o @ e compilar a variável como int

não é uma prática comum usar o pensamento


Ao contrário dos sigils de Perl, um prefixo @ antes de um nome de variável em C # não tem significado. Se x é uma variável, @x é outro nome para a mesma variável.

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

Mas o prefixo @ tem um uso , como você descobriu - você pode usá-lo para esclarecer nomes de variáveis ​​que o C # rejeitaria como ilegais.

> string string;
Identifier expected; 'string' is a keyword

> string @string;

O símbolo @ permite que você use palavras-chave reservadas para o nome da variável. como @int , @string , @double etc.

Por exemplo:

string @public = "Reserved Keyword used for me and its fine";

O código acima funciona bem, mas abaixo não funcionará:

string public = "This will not compile";






specifications