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

298

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 (adicionei uma referência da Web ao meu projeto) que foi escrita em Java. Um dos objetos de interface definidos no WSDL tinha uma variável de membro com o nome "params". Obviamente, essa é uma palavra reservada em C #, portanto 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 parecida com esta:

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

Pesquisei a documentação do c # do VS 2008, mas não consegui encontrar nada sobre isso. Também pesquisar no Google não me deu respostas úteis. Então, qual é o significado exato ou o uso do caractere '@' em um nome de variável / propriedade?

Remko Jansen
fonte

Respostas:

306

Diretamente da especificação de idioma 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 é realmente 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 identificador literal.

Atif Aziz
fonte
2
qual é a versão mínima direcionada do .NET suportada @?
serhio 5/07
16
O próprio .NET não define o @símbolo dessa maneira, a especificação da linguagem C # define . Ele é compatível com isso desde sua primeira versão, o C # 1.0 (lançado com o .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
9
E para aqueles que se perguntam, no VB.NET você pode usar [ ]para especificar um identificador literal, por exemplo Dim [String] As String.
MicroVirus
74

Apenas permite que você use uma palavra reservada como um nome de variável. IMHO não recomendado (exceto em casos como o seu).

rslite
fonte
6
@rslite: +1 Não recomendado :)
user7116 18/09/08
4
> never +1 Não recomendado, mas nunca diga nunca. Pode ser necessário, por exemplo, implementar uma interface COM herdada que use uma palavra-chave C # como identificador. Ou Microsoft pode introduzir novas palavras-chave em novas versões do quadro - por exemplo, o rendimento em uma ligação aplicativo negociação .NET 1.1 :)
Joe
2
@ Joe: A nova yieldpalavra-chave não é uma palavra reservada e só pode ser usada em contextos em que nenhum identificador possa aparecer legalmente . Um objetivo ao projetar novos recursos para o C # é construí-los de forma que qualquer programa que seja legal antes da adição de um novo recurso seja legal posteriormente e tenha o mesmo significado .
Supercat
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )é um bom exemplo em que você realmente não pode contorná-lo sem ter que escrever manualmente o HTML ou fazer com que o javascript altere os atributos posteriormente.
Flater
Há uma nova tendência observada no software de código aberto, em que todas as variáveis ​​são prefixadas com o símbolo "@" no código C #. Eu acredito que isso pode ser devido à familiaridade deste requisito no software PHP para variáveis. E um monte de sistemas web de código aberto são agora codificado em C # (onde, no passado, teria sido PHP)
Wasted_Coder
36

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

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

Tomer Gabel
fonte
Ponto interessante (e mnemônico útil) de que a convenção é a mesma entre "verbatim" ou " here-strings " e a nomeação de parâmetros.
21919 ruffin
13

Diferentemente dos sigilos 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 os nomes de variáveis ​​que o C # rejeitaria como ilegais.

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

> string @string;
Coronel Panic
fonte
10

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

Por exemplo:

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

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

string public = "This will not compile";
Umar Abbas
fonte
4

Simplesmente permite que você use palavras reservadas como nomes de variáveis. Eu queria um var chamado eventoutro dia. Em _eventvez disso, eu iria , mas meu colega me lembrou que eu poderia chamá-lo @event.

Mark Embling
fonte
3

Outro caso de uso são métodos de extensão. O primeiro parâmetro especial pode ser diferenciado para indicar seu significado real com o @thisnome. 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];
    }
BartoszKP
fonte
1

Se usarmos uma palavra-chave como o nome de um identificador, obteremos o erro do compilador "identifier esperado, 'Identifier Name' é uma palavra-chave" Para superar esse erro, prefixe o identificador com "@". Esses identificadores são identificadores verbatim. O caractere @ não é realmente parte do identificador; portanto, o identificador pode ser visto em outros idiomas como um identificador normal, sem o prefixo

raji vineeth
fonte
1

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

 int @int = 3; 

o compilador ignora @e compila a variável comoint

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

Mina Gabriel
fonte