方法参数的C#@修饰符

ren*_*rof 23 c# resharper

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

int Count(Func<ContratoList, bool> @where);
Run Code Online (Sandbox Code Playgroud)

什么是差异

int Count(Func<ContratoList, bool> where);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Con*_*ell 41

该@符号允许您使用变量名中的保留字.

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }
Run Code Online (Sandbox Code Playgroud)

正如Marc在他的评论及其回答中正确指出的那样,ReSharper实际上是错误的,因为它where是一个Contextual Keyword,实际上并不是一个保留字,所以你的方法将在没有@.

  • `where`***明确不是*****reserved*关键字; 它是*contextual*关键字.这意味着实际上,问题中的"@ where"实现了:完全没有. (10认同)

Mar*_*ell 26

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

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

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

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

  • 值得一提的是,where where不仅是LINQ关键字,还用于泛型类型约束 (4认同)