方法参数的C#@修饰符

我在VS2010上使用ReSharper插件,我正在生成一个接口方法。 ReSharper在参数名称上加上@。 那用的是什么?

int Count(Func @where); 

什么是差异

 int Count(Func where); 

谢谢!

@符号允许您在变量名中使用保留字 。

 int @class = 1; void MyMethod(int @goto); bool @public { get; set; } 

正如Marc在他的评论及其回答中正确指出的那样,ReSharper实际上是错误的,因为Context是关键字 ,而实际上并不是保留字,所以你的方法将在没有@情况下编译。

在许多方面,resharper做错了。 where是一个上下文关键字,意思是:它仅在某些特定场景(即LINQ)中充当关键字。 在所示的位置,它实际上什么也没做。 它不会被混淆为关键字,因为当C#语言设计者向C#添加关键字时,他们需要确保预先存在的代码继续编译(尽可能),这在早期的C#中是合法的。

@的使用也使某些工具混淆/复杂化(特别是razor,因为razor已经使用@来表示代码的开始 – 这意味着对于使用@的变量(即@string ),有时你需要@ ,有时你需要@@ – 我知道至少有一个假阳性的IDE警告可能导致这种情况。

然而! 如果参数是ifclass等,则@if / @class允许您将其用作变量名而不是混淆为C#关键字。 注意,这也不是一个好主意。 但出于同样的原因,我们不会开始对我们所有的代码( string @name = ...等)这样做 – 所以为什么要在这里呢? 它不是必需的, 正如这个问题所certificate的那样 ,它增加了混乱。

但就个人而言,我会找到一个不是关键字或contextual-keyword的参数名称。

它允许您使用保留关键字作为变量名称。

它会使这个参数像关键字一样停止(因为linq中的关键字在其他地方)。

这样做是因为’where’是C#(LINQ)中受保护的关键字

它允许您使用保留字作为参数。