2011-11-08 23 views
23

Estaba usando el complemento ReSharper en VS2010 y estaba generando un método de interfaz. ReSharper puso un @ en el nombre del parámetro. ¿Para qué se usa?C# @ modificador para los parámetros de métodos

int Count(Func<ContratoList, bool> @where); 

¿Cuál es la diferencia para

int Count(Func<ContratoList, bool> where); 

Gracias!

+0

Mira esta publicación sobre el operador '@' verbatim http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html – ja72

Respuesta

41

El símbolo @ le permite usar reserved words con un nombre de variable.

int @class = 1; 

void MyMethod(int @goto); 

bool @public { get; set; } 

Como Marc señaló correctamente en su comentario y su respuesta, ReSharper es en realidad incorrecta de hacer esto porque es una whereContextual Keyword y en realidad no es una palabra reservada, por lo que su método se compilará sin la @.

+10

'where' *** no es explícitamente *** a * reserved * palabra clave; es una palabra clave * contextual *. Esto significa que, en efecto, el '@ where' en la pregunta logra: exactamente nada. –

+0

Sí, tienes razón.Sí dice eso en el enlace que incluí en la respuesta, pero asumí que es lo mismo con 'donde' debido a la pregunta. Sin embargo, he votado a favor de tu respuesta. ¡Bien visto! – Connell

+1

Resharper es excesivamente entusiasta al agregar @ a las cosas. –

1

le permite utilizar palabras reservadas como params.

4

Le permite utilizar palabras clave reservadas como nombres de variables.

3

Esto se hace porque 'donde' es una palabra clave protegida en C# (LINQ)

4

Se detendrá este parámetro actuando como una palabra clave (como where es una palabra clave en LINQ entre otras cosas).

+2

No actuaría como palabra clave en esa posición. –

+0

@Marc: ese es un buen punto. Simplemente debe estar aplicándolo como una regla general; tratar de hacerlo a la perfección según el contexto supondría un desafío mayor, supongo. –

26

De muchas maneras, el reajuste es incorrecto para hacer esto. where es una palabra clave contextual , lo que significa que solo actúa como palabra clave en algunos escenarios muy específicos (es decir, LINQ). En la posición indicada, en realidad no hace nada. No se confundiría como una palabra clave allí, como cuando los diseñadores del lenguaje C# agregan palabras clave a C# que necesitan para garantizar que el código preexistente continúe compilando (en la medida de lo posible), y eso habría sido legal en C# anterior.

El uso de @ también confunde/complica algunas herramientas (navaja, en particular, dado que la maquinilla de afeitar ya utiliza @ para indicar el inicio de código - lo que significa que una variable utilizando @ (es decir @string) A veces es necesario @ y que a veces Necesito @@ - y sé de al menos una advertencia IDE falsamente positiva que esto puede causar).

¡Sin embargo! Si el parámetro fue if o class etc., entonces @if/@class le permite usarlo como un nombre de variable en lugar de confundirse como una palabra clave C#. Eso también no es una gran idea, tenga en cuenta. Pero por la misma razón, no comenzaríamos a hacerlo a todos nuestro código (string @name = ... etc.) - entonces, ¿por qué hacerlo aquí? No es necesario, y como lo demuestra esta pregunta, ha agregado confusión.

Personalmente, sin embargo, encontraría un nombre de parámetro que no sea una palabra clave o una palabra clave contextual.

+4

También puede valer la pena añadir que 'WHERE' no es sólo una palabra clave LINQ, pero también se utiliza para las restricciones de tipo genérico – Connell

+0

Sí, los diseñadores están tratando de asegurarse de que el código existente no se rompe la medida de lo posible. Sin embargo, me sorprendió bastante cuando un lunes por la mañana el módulo que nadie tocó en un par de meses de repente se negó a construir. Resulta que usó 'async' como nombre de parámetro de método. Moral: no instales Async CTP antes de ir al fin de semana – Dyppl

Cuestiones relacionadas