2008-10-31 253 views
116

He estado trabajando con algún código heredado C# y he estado viendo muchos símbolos @ delante de nombres de variables. ¿Qué significa esto o qué significa?¿Qué significa colocar un @ delante de un nombre de variable C#?

Actualmente estoy viendo mucho frente a las variables con nombres comunes que no están reservados. Por ejemplo:

MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode); 

Dado que el paso no es una palabra reservada, ¿hay alguna razón por la que deba escaparse?

+0

muéstranos algunos ejemplos. ¿Son palabras reservadas como @public o solo nombres variables como @weddingDate? – kloucks

Respuesta

154

Es solo una manera de permitir declarar palabras clave reservadas como vars.

void Foo(int @string) 
+3

Eso tiene sentido, pero ¿se le ocurre alguna razón por la que las personas los pongan por delante de nombres de variables que no son palabras clave, aparte de que el desarrollador original es estúpido? –

+1

Supongo que el codificador anterior no sabía cómo funcionaban. –

+0

¡Quizás quería estar seguro, como doblemente más seguro! ¡En caso de que la variable se convierta de repente en una palabra clave reservada! –

5

Esto escapa de las palabras reservadas en C#.

33

Le permite usar una palabra reservada, como 'public', por ejemplo, como un nombre de variable.

string @public = "foo"; 

No recomendaría esto, ya que puede provocar una confusión innecesaria.

15

Poner @ delante de una cuerda le dice al computador que no procese las secuencias de escape encontradas dentro de la cadena.

De the documentation:

La ventaja de @ -quoting es que las secuencias de escape no son procesados, lo que hace que sea fácil de escribir, por ejemplo, un nombre de archivo completo:

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt" 

Incluir una comilla doble en una cadena -quoted @, el doble que:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain. 

Otro uso del símbolo @ es el uso de referencia (/ de referencia) identificador s que resultan ser palabras clave de C#. Para obtener más información, consulte 2.4.2 Identifiers.

+5

Variables, no literales de cadena. –

+2

@Orion: sí, también se explica al final ;-) –

+0

Una vez que la cadena está en una variable, ya se ha escapado, ya que se debe analizar para asignarla a una variable, por lo que agregar una @ a una variable de cadena es no es lo mismo que agregarlo a un literal de cadena. –

3

La pregunta original pregunta por qué uno escaparía de una palabra no reservada. Lo que me viene a la mente es que si step se convirtiera en una palabra reservada en el futuro, el ejemplo del código aún se compilaría. Supongo que también es una opción válida para generadores de código.

2

El signo @ se utiliza con identificadores que son los mismos que las palabras clave del idioma. Hay dos usos principales para este - interoperando con código que no es C#. En idiomas como VB o IronPython, las palabras clave no son las mismas que en C# y es posible que hayan declarado clases y propiedades con nombres que coincidan con las palabras clave de C#. Si esta característica no estaba presente, este código no sería accesible en C#. - código generado por la máquina. Si un generador de código genera código basado en alguna fuente externa (por ejemplo, WSDL), el generador puede simplemente prefijar todos los identificadores con @ y no verificar y convertir identificadores que coincidan con las palabras clave de C#.

¿Estás seguro de que tu caso no es el segundo?

Cuestiones relacionadas