ReSharper给出了一个“@";lambda表达式中变量名的前缀

本文关键字:lambda quot 表达式 前缀 变量名 一个 ReSharper | 更新日期: 2023-09-27 18:24:41

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

ReSharper给出了一个“@";lambda表达式中变量名的前缀

@符号允许您为变量名使用保留关键字。如CCD_ 2。我想Resharper这样做是为了安全。

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

您可能需要询问resharper实现者是否确定,但我可以做出有根据的猜测。它们可能是面向未来的。

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

当resharper工具为您生成代码时,他们不知道该代码是否将在某个假设的C#中编译,该C#在某些上下文中使用t作为上下文关键字。因此,他们通过将@放在前面,先发制人地喊出"这个标识符不是上下文关键字",从而"证明"设计的未来性

顺便说一句,这正是任何标识符以@为前缀是合法的原因。

更多信息请点击此处:

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

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

groups.Select(group => ...)

会变成这个

from group in groups ...

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

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

int @if;

单独使用if是行不通的,因为if是一个c#关键字。

t前面的@在这里是无用的。可能是写这篇文章的人使用了他的私有命名约定,并用它来表示lambda参数。

(好吧,我明白了,这是雷沙珀,而不是一个人,不管它本可以是什么)。

我只见过@在这一次重构中使用:将LINQ转换为方法链。在这种情况下,ReSharper创建了许多lambda变量(可能是一个大的数,这取决于转换的lambda表达式的复杂性)。

关于原因的一种猜测是,他们可能故意使用了一些丑陋的东西,希望你能用有意义的名字来代替它们。ReSharper并没有太多的线索可以用来猜测一个有意义的名字,所以这取决于你。

在其他生成器中,为@生成的事物加前缀也是一种常见行为
我至少在wsdl.exe生成的web服务代理中看到了它。wsdl将属性protected命名,而wsdl.exe则生成了名为@protect的属性。因此,与C#关键字protected没有冲突
但我不知道为什么在您的情况下会以t为前缀。您的类中是否有名称为t的静态成员?