2012-02-16 6 views
30

Cuando usa ReSharper agrega automáticamente un @, ¿por qué?ReSharper da un prefijo "@" a un nombre de variable en una expresión lambda

public static string RemoveDiacritics(this string input) 
{ 
    if (string.IsNullOrEmpty(input)) return input; 
    var normalizedString = input.Normalize(NormalizationForm.FormD); 
    var stringBuilder = new StringBuilder(); 
    foreach (var value in normalizedString.Select(value => 
     new {value, unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(value)}) 
      .Where(@t => @t.unicodeCategory != UnicodeCategory.NonSpacingMark) 
      .Select(@t => @t.value)) stringBuilder.Append(value); 
    return (stringBuilder.ToString().Normalize(NormalizationForm.FormC)); 
} 
+0

Me he preguntado por qué también. Estoy adivinando una convención para ayudar a la lectura, pero podría estar equivocado. – spender

+0

Usando 'string.Concat', podría eliminar el' StringBuilder' y el bucle. – spender

Respuesta

26

El símbolo @ le permite utilizar una palabra clave reservada para un nombre de variable. Tal como @class. Asumo que Resharper hace esto para estar a salvo.

En este caso, no es necesario y no tiene ningún efecto.

+0

Seguro ... probablemente, pero que huele a pereza en r # hq, que no es algo que normalmente asocio con r #. – spender

+4

Noté que R # a veces agrega '@' antes de 'group', incluso en casos donde no es necesario. 'group' es una palabra clave contextual, por lo que' @' a veces es necesario, pero R # no parece reconocer esos casos y solo pone '@' allí siempre. – svick

+1

@svick: No estoy seguro de si * debería * reconocer esos casos. Poner un símbolo '@' es una buena manera de evitar que los mantenedores futuros lo confundan con la palabra clave contextual (inválida). – Brian

2

El signo a (@) escapa a los nombres. P.ej. Si desea utilizar if como nombre de variable puede escribir

int @if; 

if por sí sola no funcionaría, ya que es una if C# palabra clave.

El @ delante de t es inútil aquí. Probablemente la persona que escribió eso está usando sus convenciones de nomenclatura privadas y lo usa para denotar parámetros lambda.

(OK, veo, era Resharper, no una persona, sin embargo podría haber sido).

2

Solo he visto @ utilizado en esta refactorización: Convertir LINQ en cadena de métodos. En este caso, ReSharper está creando una cantidad de variables lambda (posiblemente un número grande, dependiendo de la complejidad de la expresión lambda que se está convirtiendo).

Una suposición en cuanto a la razón es que podrían haber usado deliberadamente algo feo con la esperanza de que los reemplaces con nombres significativos. Realmente no hay muchas pistas que ReSharper pueda usar para adivinar un nombre significativo, por lo que depende de usted.

0

Para prefijar cosas generadas por @ es un comportamiento habitual en otros generadores también.
Lo vi al menos en un proxy de servicio web generado por wsdl.exe. El WSDL nombró una propiedad protegida y el archivo wsdl.exe generó una propiedad con el nombre @protected. Por lo tanto, no hay conflicto con la palabra clave C protected.
Pero no sé por qué t tiene el prefijo en su caso. ¿Hay algún miembro estático en su clase que tenga el nombre t?

22

Tendría que pedirle a los implementadores de reafiladores que sean ciertos, pero puedo hacer una conjetura. Probablemente sean pruebas futuras.

En el tiempo transcurrido desde C# 1.0 enviado, el equipo del compilador ha agregado 21 nuevas palabras clave contextuales a C#; el compilador los trata como palabras clave cuando aparecen en ciertas ubicaciones, y como identificadores ordinarios en caso contrario. yield, por ejemplo, es solo una palabra clave cuando aparece antes de return.

Cuando la herramienta resharper genera código para usted, no se sabe si ese código se compilará en alguna hipotética C# 6 que use t como palabra clave contextual en algún contexto. Por lo tanto, "proban el futuro" del diseño diciendo "este identificador no es una palabra clave contextual" al poner el @ al frente.

Dicho sea de paso, esta es la razón por la cual es legal cualquier identificador con el prefijo @.

Más información aquí:

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

4

Sólo un poco de contexto, en ReSharper 5 hubo un error en esto:

groups.Select(group => ...) 

se convertiría en este

from group in groups ... 

Ahora, el grupo es una palabra clave en la sintaxis de consulta de LINQ, por lo que la acción de refactorización de R # 5 lly rompió el código. En R # 6 esto aparentemente se solucionó usando @ para identificadores.

+0

¡Gracias! Me he confundido todo el tiempo por qué resharper solo está agregando el @ delante de mi variable de grupo. ¡Ahora tiene sentido para mí! – Frame91

Cuestiones relacionadas