方法参数的C#@修饰符

时间:2011-11-08 13:57:03

标签: c# resharper

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

int Count(Func<ContratoList, bool> @where);

的区别是什么
int Count(Func<ContratoList, bool> where);

谢谢!

6 个答案:

答案 0 :(得分:41)

@符号允许您在变量名称中使用reserved words

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }

正如Marc在他的评论和答案中正确指出的那样,ReSharper实际上是错误的,因为whereContextual Keyword并且实际上不是保留字,所以你的方法将在没有@

答案 1 :(得分:26)

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

@的使用也会使某些工具混淆/复杂化(特别是剃刀,因为剃刀已经使用@来表示代码的开头 - 这意味着对于使用@的变量(即@string)有时您需要@,有时您需要@@ - 而且我知道这可能导致至少一个误报IDE警告。

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

它会阻止此参数像关键字一样(因为where是linq中的关键字,除其他外)。

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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