¿Cuál es el uso / significado del carácter @ en los nombres de variables en C #?

298

Descubrí que puede comenzar su nombre de variable con un carácter '@' en C #. En mi proyecto C # estaba usando un servicio web (agregué una referencia web a mi proyecto) que estaba escrito en Java. Uno de los objetos de interfaz definidos en el WSDL tenía una variable miembro con el nombre "params". Obviamente, esta es una palabra reservada en C #, por lo que no puede tener una clase con una variable miembro con el nombre "params". El objeto proxy que se generó contenía una propiedad que se parecía a esto:

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

Busqué en la documentación de VS 2008 c # pero no pude encontrar nada al respecto. Además, buscar en Google no me dio ninguna respuesta útil. Entonces, ¿cuál es el significado exacto o el uso del carácter '@' en un nombre de variable / propiedad?

Remko Jansen
fuente

Respuestas:

306

Directamente desde la especificación del lenguaje C # , identificadores (C #) :

El prefijo "@" permite el uso de palabras clave como identificadores, lo cual es útil al interactuar con otros lenguajes de programación. El carácter @ no es realmente parte del identificador, por lo que el identificador puede verse en otros idiomas como un identificador normal, sin el prefijo. Un identificador con un prefijo @ se denomina identificador literal.

Atif Aziz
fuente
2
¿Cuál es la versión mínima específica de .NET compatible @?
serhio
16
.NET en sí no define el @símbolo de esta manera, la especificación del lenguaje C # sí. Ha sido compatible con esto desde su primera versión, C # 1.0 (lanzado con .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
99
Y para aquellos que se preguntan, en VB.NET puede usar [ ]para especificar un identificador literal, por ejemplo Dim [String] As String.
MicroVirus
74

Simplemente le permite usar una palabra reservada como nombre de variable. No se recomienda en mi humilde opinión (excepto en casos como usted).

rslite
fuente
66
@rslite: +1 no recomendado :)
user7116
44
> nunca +1 No recomendado, pero nunca digas nunca. Es posible que, por ejemplo, necesite implementar una interfaz COM heredada que use una palabra clave C # como identificador. O Microsoft puede introducir nuevas palabras clave en nuevas versiones de Framework, por ejemplo, rendimiento en una aplicación de negociación de bonos .NET 1.1 :)
Joe
2
@Joe: la nueva yieldpalabra clave no es una palabra reservada, y solo se puede usar en contextos donde legalmente no puede aparecer ningún identificador . Un objetivo al diseñar nuevas características para C # es construirlas de tal manera que cualquier programa que sea legal antes de que se agregue una nueva característica será legal después y tendrá el mismo significado .
supercat
66
@Html.TextboxFor( , , , new { @class="my-css-class" } )es un buen ejemplo en el que realmente no puede evitarlo sin tener que escribir manualmente el HTML, o hacer que JavaScript cambie los atributos en una etapa posterior.
Flater
Hay una nueva tendencia que se ve en el software de código abierto donde todas las variables tienen el prefijo "@" en el código C #. Creo que esto puede deberse a la familiaridad de este requisito en el software PHP para variables. Y muchos sistemas web de código abierto ahora están codificados en C # (donde en el pasado hubiera sido PHP)
Wasted_Coder
36

En C #, el carácter at (@) se usa para denotar literales que explícitamente no se adhieren a las reglas relevantes en la especificación del lenguaje.

Específicamente, se puede usar para nombres de variables que entren en conflicto con palabras clave reservadas (por ejemplo, no puede usar params pero puede usar @ params en su lugar, lo mismo con out / ref / cualquier otra palabra clave en la especificación del lenguaje). Además, se puede usar para literales de cadena sin escape; Esto es particularmente relevante con las constantes de ruta, por ejemplo, en lugar de path = "c:\\temp\\somefile.txt"que pueda escribir path = @"c:\temp\somefile.txt". También es realmente útil para expresiones regulares.

Tomer Gabel
fuente
Punto interesante (y nemotécnico útil) de que la convención es la misma entre "verbatim-" o " here-strings " y la denominación de parámetros.
ruffin
13

A diferencia de los sigilos de Perl, un @prefijo antes de un nombre de variable en C # no tiene significado. Si xes una variable, @xes otro nombre para la misma variable.

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

Pero el @prefijo tiene un uso , como descubrió: puede usarlo para aclarar nombres de variables que C # rechazaría como ilegales.

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

> string @string;
Coronel Panic
fuente
10

El @símbolo le permite usar palabras clave reservadas para el nombre de la variable. como @int, @string, @doubleetc.

Por ejemplo:

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

El código anterior funciona bien, pero a continuación no funcionará:

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

Simplemente le permite usar palabras reservadas como nombres de variables. Quería una var llamada eventel otro día. Iba a ir con él _event, pero mi colega me recordó que podía llamarlo @event.

Mark Embling
fuente
3

Otro caso de uso son los métodos de extensión. El primer parámetro especial se puede distinguir para denotar su significado real con el @thisnombre. Un ejemplo:

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
fuente
1

Si usamos una palabra clave como nombre para un identificador, obtenemos un error del compilador "identificador esperado, 'Nombre del identificador' es una palabra clave". Para superar este error, prefije el identificador con "@". Dichos identificadores son identificadores textuales. El carácter @ no es realmente parte del identificador, por lo que el identificador puede verse en otros idiomas como un identificador normal, sin el prefijo

raji vineeth
fuente
1

Puede usarlo para usar las palabras clave reservadas como nombre de variable como

 int @int = 3; 

el compilador ignorará @y compilará la variable comoint

no es una práctica común usar el pensamiento

Mina Gabriel
fuente