c# @方法参数的修饰符

本文关键字:参数 方法 | 更新日期: 2023-09-27 18:13:43

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

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

有什么不同?
int Count(Func<ContratoList, bool> where);

谢谢!

c# @方法参数的修饰符

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

int @class = 1;
void MyMethod(int @goto);
bool @public { get; set; }

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

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

@的使用也使一些工具(特别是razor,因为razor已经使用@来指示代码的开始-这意味着对于使用@(即@string)的变量,有时您需要@,有时您需要@@ -我知道这可能导致至少一个假阳性IDE警告)。

然而

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

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

允许使用保留关键字作为变量名

它将阻止该参数像关键字一样工作(因为where在linq中是一个关键字)

这是因为'where'在c# (LINQ)中是受保护的关键字

允许使用保留字作为参数