Qual é o uso/significado do caractere @ em nomes de variáveis em C#?
-
01-07-2019 - |
Pergunta
Descobri que você pode iniciar o nome da sua variável com um caractere '@' em C#.No meu projeto C# eu estava usando um serviço web (adicionei uma referência web ao meu projeto) que foi escrito em Java.Um dos objetos de interface definidos no WSDL possuía uma variável membro com o nome "params".Obviamente, esta é 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 gerado continha uma propriedade semelhante a esta:
public ArrayList @params {
get { return this.paramsField; }
set { this.paramsField = value; }
}
Pesquisei na documentação c# do VS 2008, mas não consegui encontrar nada sobre isso.Além disso, pesquisar no Google não me deu nenhuma resposta útil.Então, qual é o significado exato ou uso do caractere '@' em um nome de variável/propriedade?
Solução
Direto do Especificação de idioma c#, Identificadores (C#) :
O prefixo "@" permite o uso de palavras -chave como identificadores, o que é útil ao 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 literal.
Outras dicas
Ele apenas permite que você use uma palavra reservada como um nome de variável. Não recomendado IMHO (exceto em casos como você tem).
Em C#, o caractere at (@) é usado para denotar literais que explicitamente não aderem às regras relevantes nas especificações da linguagem.
Especificamente, pode ser usado para nomes de variáveis que colidem com palavras-chave reservadas (por exemplovocê não pode usar parâmetros, mas pode usar @params, o mesmo com out/ref/qualquer outra palavra-chave na especificação do idioma).Além disso, pode ser usado para literais de string sem escape;isso é particularmente relevante com constantes de caminho, por ex.em vez de path = "c:\\temp\\somefile.txt"
você pode escrever path = @"c:\temp\somefile.txt"
.Também é muito útil para expressões regulares.
Ao contrário 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 usar, 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 @
O símbolo permite que você use palavras -chave reservadas para o nome da variável. Curti @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";
Ele simplesmente permite que você use palavras reservadas como nomes de variáveis. Eu queria um Var chamado event
o outro dia. Eu ia ir com _event
em vez disso, mas meu colega me lembrou que eu poderia chamá -lo @event
em vez de.
Outro caixa de uso está em métodos de extensão. O primeiro parâmetro especial pode ser distinguido de denotar seu verdadeiro significado com @this
nome. 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];
}
Se usarmos uma palavra -chave como nome para um identificador, obtemos um erro do compilador "Identificador esperado, 'nome do identificador' é uma palavra -chave" para superar esse erro, prefixo o identificador com "@". Tais identificadores são identificadores literalmente. O personagem @ não faz parte do identificador, então o identificador pode ser visto em outros idiomas como um identificador normal, sem o prefixo
Você pode usá -lo para usar as palavras -chave reservadas como nome de variável como
int @int = 3;
o compilador ignorará o @
e compilar a variável como int
Não é uma prática comum usar o pensamento