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

时间:2012-02-16 02:11:16

标签: c# .net linq lambda resharper

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

6 个答案:

答案 0 :(得分:26)

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

在这种情况下,它不需要,也没有任何效果。

答案 1 :(得分: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/

答案 2 :(得分:4)

只是一些上下文,在ReSharper 5中有一个错误:

groups.Select(group => ...)

会变成这个

from group in groups ...

现在,group是LINQ查询语法中的关键字,因此R#5的重构实际上破坏了代码。在R#6中,这显然是用@标识符修复的。

答案 3 :(得分:2)

at符号(@)转义名称。例如。如果你想使用if作为变量名,你可以写

int @if;
仅{p> if无效,因为if是c#关键字。

@前面的t在这里毫无用处。可能写作的人正在使用他的私有命名约定并使用它来表示lambda参数。

(好吧,我知道,这是Resharper,不是一个人,不过它本来可以)。

答案 4 :(得分:2)

我在这一次重构中只看到@:将LINQ转换为方法链。在这种情况下,ReSharper正在创建一些lambda变量(可能是号,具体取决于要转换的lambda表达式的复杂性。)

有一个猜测,原因是他们可能故意使用丑陋的东西,希望你用有意义的名字取而代之。 ReSharper可以用很多提示来猜测一个有意义的名字,所以这取决于你。

答案 5 :(得分:0)

通过@为生成的东西添加前缀也是其他生成器中的常见行为 我至少在wsdl.exe生成的Web服务代理中看到过它。 WSDL将属性命名为 protected ,并且wsdl.exe生成名为 @protected 的属性。因此,与C#关键字 protected 没有冲突 但我不知道为什么 t 在你的情况下是前缀。您班级中是否有静态成员,其名称为 t