30 votes

ReSharper donne un préfixe "@" à un nom de variable dans une expression lambda

Lorsque vous utilisez ReSharper, il ajoute automatiquement un @ , pourquoi?

 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));
}
 

26voto

Joel Points 6958

Le symbole @ vous permet d'utiliser un mot-clé réservé pour un nom de variable. Tels que @class . Je suppose que Resharper fait cela pour être en sécurité.

Dans ce cas, ce n'est pas nécessaire et cela n'a aucun effet.

22voto

Eric Lippert Points 300275

Vous devez demander à la resharper exécutants, pour en être certain, mais je peux faire une supposition éclairée. Ils sont probablement les essais futurs.

Dans le temps depuis C# 1.0 fourni le compilateur est ajouté à l'équipe 21 nouveaux contextuelle des mots clés de C#; le compilateur traite ces mots clés quand ils apparaissent à certains endroits, et comme un identifiant ordinaire autrement. yield, par exemple, n'est qu'un mot-clé lorsqu'il s'affiche avant d' return.

Lorsque le resharper outil génère le code pour vous, ils ne savent pas si ce code va être compilé dans certaines hypothèses de C# 6 qui utilise t comme un mot clé contextuel dans un certain contexte. Donc ils "future proof" la conception par l'anticipation d'appeler cet identifiant n'est pas un mot clé contextuel" en mettant l' @ sur devant.

D'ailleurs, c'est précisément pourquoi il est légal pour tout identifiant avec le préfixe @.

Plus d'informations ici:

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

4voto

Michael Stum Points 72046

Juste un peu de contexte, dans ReSharper 5 il y avait un bug où ceci:

 groups.Select(group => ...)
 

serait transformé en ce

 from group in groups ...
 

Maintenant, le groupe est un mot-clé dans la syntaxe de requête LINQ, donc le refactoring de R # 5 a en fait cassé le code. Dans R # 6, cela a été apparemment corrigé en utilisant @ pour les identifiants.

2voto

Le signe arobase (@) échappe à l'noms. E. g. si vous souhaitez utiliser if comme nom de variable, vous pouvez écrire

int @if;

if seul ne fonctionne pas, depuis if c# mot-clé.

L' @ face t est inutile ici. Probablement la personne qui a écrit ce qui est à l'aide de son privé, les conventions de nommage et l'utilise pour désigner lambda paramètres.

(OK, je vois, c'était Resharper, pas une personne, mais il pourrait avoir été).

2voto

John Saunders Points 118808

Je n'ai vu que @ utilisé dans ce refactoring: Convertir LINQ to la Méthode de la Chaîne. Dans ce cas, ReSharper est la création d'un certain nombre de variables lambda (peut-être un grand nombre, en fonction de la complexité de l'expression lambda convertie).

On suppose que la raison en est qu'ils ont délibérément utilisé quelque chose de laid dans l'espoir que vous allez les remplacer par des noms significatifs. Il n'y a pas vraiment beaucoup de conseils que ReSharper pourrait utiliser pour deviner un nom significatif, donc c'est à vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X