我在VS2010上使用ReSharper插件,我正在生成一个接口方法。 ReSharper在参数名称上加了@。什么是用于?
int Count(Func<ContratoList, bool> @where);
的区别是什么
int Count(Func<ContratoList, bool> where);
谢谢!
答案 0 :(得分:41)
@
符号允许您在变量名称中使用reserved words。
int @class = 1;
void MyMethod(int @goto);
bool @public { get; set; }
正如Marc在他的评论和答案中正确指出的那样,ReSharper实际上是错误的,因为where
是Contextual Keyword并且实际上不是保留字,所以你的方法将在没有@
。
答案 1 :(得分:26)
在许多方面,resharper做错了。 where
是一个上下文关键字,意思是:它仅在某些特定场景(即LINQ)中充当关键字。在所示的位置,它实际上什么也没做。它不会被混淆为关键字,因为当C#语言设计者向C#添加关键字时,他们需要确保预先存在的代码继续编译(尽可能),这在早期的C#中是合法的。
@
的使用也会使某些工具混淆/复杂化(特别是剃刀,因为剃刀已经使用@
来表示代码的开头 - 这意味着对于使用@
的变量(即@string
)有时您需要@
,有时您需要@@
- 而且我知道这可能导致至少一个误报IDE警告。
然而!如果参数为if
或class
等,则@if
/ @class
允许您将其用作变量名称,而不是混淆为C#关键字。注意,也并不是一个好主意。但出于同样的原因,我们不会开始这样做所有我们的代码(string @name = ...
等) - 所以为什么在这里呢?它不是必需的,而正如这个问题所证明的那样,它增加了混乱。
但就个人而言,我会找到一个不是关键字或上下文关键字的参数名称。
答案 2 :(得分:4)
它允许您使用保留关键字作为变量名称。
答案 3 :(得分:4)
它会阻止此参数像关键字一样(因为where
是linq中的关键字,除其他外)。
答案 4 :(得分:3)
这样做是因为'where'是C#(LINQ)中受保护的关键字
答案 5 :(得分:1)
它允许您使用保留字作为参数。