2011-11-08 50 views
23

我在VS2010上使用了ReSharper插件,并且我正在生成接口方法。 ReSharper将@放在参数名称上。那是用来干什么的?C#@方法参数修饰符

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

请告诉我的

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

感谢的区别!

+0

请看这篇关于'@'逐字运算符http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html – ja72

回答

41

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

int @class = 1; 

void MyMethod(int @goto); 

bool @public { get; set; } 

正如马克正确他的意见,他的回答中指出,实际上ReSharper的是错误要做到这一点,因为whereContextual Keyword的,实际上并不是一个保留字,所以你的方法编译没有@

+10

'的文章,其中***明确地不是*** a * reserved *关键字;它是一个*上下文*关键字。这意味着实际上,问题中的“@ where”达到了:完全没有。 –

+0

是的,你是对的。它确实表示,我在答案中包含的链接中,但是由于问题的原因,我认为它与'where'是一样的。我已经提出了你的答案,很好的发现! – Connell

+1

Resharper过分热衷于将@添加到事物中。 –

1

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

4

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

3

这样做是因为“这里”是在C#(LINQ)

4

它将停止此参数像个关键字保护的关键字(如where是在LINQ关键字除其他事项外)。

+2

它不会作为该位置的关键字。 –

+0

@Marc - 这是一个很好的观点。它必须只是将其作为一个通用规则来应用 - 试图通过上下文完美地完成它将是我猜想的更多挑战。 –

26

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

@的使用也混淆了一些工具(剃刀,尤其/复杂,因为剃须刀已经使用@指示的代码的开始 - 这意味着使用@(即@string)有时你需要@,有时你的变量需要@@ - 我知道至少有一个错误的IDE警告可能会导致)。

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

虽然我个人认为参数名称不是关键字或上下文关键字。

+4

值得一提的是,where不仅是一个LINQ关键字,而且还用于泛型类型约束 – Connell

+0

是的,设计人员正试图确保现有代码尽可能不中断。然而,当我的一个星期一的早晨,几个月没有人碰到的模块突然拒绝建立时,我感到非常惊讶。原来,它使用'async'作为方法参数名称。士气:在周末之前不要安装异步CTP – Dyppl