【问题标题】:C# @ modifier for methods parameters用于方法参数的 C# @ 修饰符
【发布时间】:2011-11-08 13:57:02
【问题描述】:

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

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

有什么区别

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

谢谢!

【问题讨论】:

标签: c# resharper


【解决方案1】:

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

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }

正如 Marc 在他的评论和他的回答中正确指出的那样,ReSharper 这样做实际上是错误的,因为 whereContextual Keyword 并且实际上不是保留字,因此您的方法将在没有 @ 的情况下编译。

【讨论】:

  • where 明确不是 保留关键字;它是一个 contextual 关键字。这意味着实际上,问题中的@where 实现了:完全没有。
  • 是的,你是对的。它确实在我包含在答案中的链接中说,但由于这个问题,我认为它与where 相同。不过,我赞成你的回答,很好发现!
  • Resharper 过分热衷于在事物中添加@。
【解决方案2】:

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

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

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

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

【讨论】:

  • 可能还值得补充一点,where 不仅是 LINQ 关键字,还用于泛型类型约束
  • 是的,设计人员正在努力确保现有代码尽可能不中断。然而,当一个星期一早上,几个月没人碰过的模块突然拒绝构建时,我感到非常惊讶。原来,它使用async 作为方法参数名称。士气:周末前不要安装异步 CTP
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    它将阻止此参数像关键字一样起作用(因为 where 是 linq 中的关键字等)。

    【讨论】:

    • 它不会在该位置充当关键字。
    • @Marc - 这是一个很好的观点。它必须只是将其应用为一般规则-我想尝试根据上下文完美地做到这一点将更具挑战。
    【解决方案5】:

    这样做是因为 'where' 是 C# (LINQ) 中的受保护关键字

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 2011-04-13
        • 1970-01-01
        • 2015-12-08
        相关资源
        最近更新 更多