我在VS2010上使用了ReSharper插件,并且我正在生成接口方法。 ReSharper将@放在参数名称上。那是用来干什么的?C#@方法参数修饰符
int Count(Func<ContratoList, bool> @where);
请告诉我的
int Count(Func<ContratoList, bool> where);
感谢的区别!
我在VS2010上使用了ReSharper插件,并且我正在生成接口方法。 ReSharper将@放在参数名称上。那是用来干什么的?C#@方法参数修饰符
int Count(Func<ContratoList, bool> @where);
请告诉我的
int Count(Func<ContratoList, bool> where);
感谢的区别!
@
符号允许您在变量名中使用reserved words。
int @class = 1;
void MyMethod(int @goto);
bool @public { get; set; }
正如马克正确他的意见,他的回答中指出,实际上ReSharper的是错误要做到这一点,因为where
是Contextual Keyword的,实际上并不是一个保留字,所以你的方法编译没有@
。
'的文章,其中***明确地不是*** a * reserved *关键字;它是一个*上下文*关键字。这意味着实际上,问题中的“@ where”达到了:完全没有。 –
是的,你是对的。它确实表示,我在答案中包含的链接中,但是由于问题的原因,我认为它与'where'是一样的。我已经提出了你的答案,很好的发现! – Connell
Resharper过分热衷于将@添加到事物中。 –
它允许您使用保留字作为参数。
它允许您使用保留关键字作为变量名称。
这样做是因为“这里”是在C#(LINQ)
它将停止此参数像个关键字保护的关键字(如where
是在LINQ关键字除其他事项外)。
它不会作为该位置的关键字。 –
@Marc - 这是一个很好的观点。它必须只是将其作为一个通用规则来应用 - 试图通过上下文完美地完成它将是我猜想的更多挑战。 –
在许多方面,resharper是不对的做到这一点。 where
是上下文关键字,意思是:它只在某些特定场景(即LINQ)中充当关键字。在所表明的立场中,它实际上什么都不做。它不会被混淆为关键字,因为当C#语言设计者向C#添加关键字时,他们需要确保预先存在的代码继续编译(尽可能),并且这在早期的C#中是合法的。
的@
的使用也混淆了一些工具(剃刀,尤其/复杂,因为剃须刀已经使用@
指示的代码的开始 - 这意味着使用@
(即@string
)有时你需要@
,有时你的变量需要@@
- 我知道至少有一个错误的IDE警告可能会导致)。
但是!如果参数是if
或class
等,则@if
/@class
允许您将其用作变量名称,而不是将其作为C#关键字混淆。请注意,也是不是一个好主意。但出于同样的原因,我们不会开始这样做全部我们的代码(string @name = ...
等) - 为什么在这里?这是不需要的,并且由这个问题所示,它增加了混淆。
虽然我个人认为参数名称不是关键字或上下文关键字。
请看这篇关于'@'逐字运算符http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html – ja72