C#方法参数的@修饰符

23
我在VS2010上使用了ReSharper插件,生成了一个接口方法。ReSharper在参数名前加上了@符号。这个符号有什么作用?
int Count(Func<ContratoList, bool> @where);

这两者有何区别?

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

谢谢!


看看这篇关于 @ 直接量运算符的文章:http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html - John Alexiou
6个回答

41

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

@符号可以使您在变量名中使用保留字。

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }

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


10
where并不是一个保留关键字,而是一个上下文关键字。这意味着,在实际效果中,问题中的@where什么也没有实现。 - Marc Gravell
是的,你说得对。在我回答中包含的链接中确实有这样的说明,但由于问题的关系,我认为where也是一样的。不过我已经给你的回答点了赞,发现得很好! - Connell
1
Resharper在添加@符号方面过于热衷。 - Ritch Melton

26
在许多方面,resharper 的这种做法是错误的。其中 where 是一个上下文关键字,意思是:它仅在一些非常特定的情况(即 LINQ)中才作为关键字使用。在所示位置,它实际上不起作用。它在那里不会被误认为是关键字,因为当 C# 语言设计师向 C# 添加关键字时,他们需要确保既有代码继续编译(尽可能),并且在早期的 C# 中这是合法的。 @ 的用法也会使一些工具(特别是 razor)混淆/复杂化,因为 razor 已经使用 @ 来表示代码的开头 - 这意味着对于使用 @ 的变量(即 @string),有时需要使用 @,有时需要使用 @@ - 并且我知道至少有一个此问题会导致虚警 IDE 警告。
然而!如果参数是 ifclass 等,则 @if / @class 允许您使用该名称作为变量名,而不会将其误认为是 C# 关键字。但请注意,这也不是一个好主意。但同样的道理,我们不会在所有代码中开始这样做(例如 string @name = ...)- 那么为什么要在这里这样做呢?这是没有必要的,并且正如本问题所示,它增加了混淆。
个人而言,我会找到一个不是关键字或上下文关键字的参数名称。

4
值得一提的是,where不仅是LINQ关键字,还用于泛型类型约束。 - Connell
是的,设计师们正在尽可能地确保现有代码不会出现问题。然而,有一次周一早上,大家都没有碰过几个月的模块突然无法构建,这让我感到非常惊讶。原来,它使用了 async 作为方法参数名称。故事寓意:在周末之前不要安装 Async CTP。 - Dyppl

4
它允许您将保留关键字用作变量名。

4

它将停止该参数起关键字作用(例如,在linq中,where是一个关键字)。


2
在那个位置它不会作为关键字起作用。 - Marc Gravell
@Marc - 那是个好观点。它必须只是将其应用为一般规则 - 尝试通过上下文完美地执行它可能更具挑战性。 - Jon Egerton

3
这是因为“where”是C#(LINQ)中的保留关键字。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接