ReSharper为lambda表达式中的变量名提供"@"前缀

Jav*_*rez 30 .net c# linq resharper lambda

使用ReSharper时会自动添加@,为什么?

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));
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 26

@符号允许您为变量名使用保留关键字.如@class.我认为Resharper这样做是安全的.

在这种情况下,它不是必需的,它没有任何效果.

  • 我注意到R#有时在`group`之前添加`@`,即使在没有必要的情况下也是如此.`group`是一个上下文关键字,所以`@`有时是必要的,但R#似乎并不认识那些情况,只是把`@`放在那里. (4认同)

Eri*_*ert 22

你必须要求resharper实施者确定,但我可以做出有根据的猜测.它们可能是未来的证明.

自C#1.0发布以来,编译器团队已向C#添加了21个新的上下文关键字 ; 当编译器出现在某些位置时,编译器会将这些视为关键字,否则将其视为普通标识符.yield例如,它只是之前出现的关键字return.

当resharper工具为您生成代码时,他们不知道该代码是否将在某些假设的C#6中编译,该C#6 t在某些上下文中用作上下文关键字.因此,他们通过预先调用"此标识符不是上下文关键字",通过放在@它的前面来"设计未来" .

顺便说一句,这正是为什么任何标识符都是合法的为什么是合法的@.

更多信息:

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