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