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));
}
@符号允许您为变量名使用保留关键字。如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的静态成员?