C# @ 运算符(不适用于字符串字面量)

16

这里的 @ 是什么意思呢(我知道它使用了过时的.NET Framework 1.1 ConfigurationSettings.AppSettings)?

@ConfigurationSettings.AppSettings["some_setting"];

这不是一个字符串字面值:在字符串变量中使用字面值 '@'

实际代码:

_scale_id_regex = @ConfigurationSettings.AppSettings["ScaleIdRegEx"];

在一个常规的.cs文件中,它是Windows服务的一部分,并且_scale_id_regex只是该类中的私有字符串,因此ASP.NET和Razor没有涉及。


你在哪里看到这个的?在 Razor 源文件 (.cshtml) 中看到这种用法比在 C# 源文件中更为常见。 - sellmeadog
@sellmeadog - 你可能也需要在LINQ中使用它,可以看看我的回答。 - manojlds
4个回答

27

这被称为“verbatim标识符”。它允许你在保留字之后命名变量,例如:

string @string = string.Empty;
object @object = new object();
int @int = 1;
...
你的代码是有效的,但我认为@ 在那里没有任何实际用途。既然这个问题得到了比我刷新页面更快的赞同,那么这就是ECMA C#语言规范9.4.2节所说的内容。
“@”前缀使关键字可以用作标识符,这在与其他编程语言进行接口时非常有用。字符@实际上并不是标识符的一部分,因此在其他语言中,该标识符可能被视为正常标识符,无需前缀。带有@前缀的标识符称为逐字面量标识符。
你发布的代码是有效的,因为这是语言规范允许的,尽管不鼓励使用。
“[注意:对于不是关键字的标识符使用@前缀是允许的,但出于风格上的考虑强烈不建议这样做。 结束注意]”

这很有趣。OP问题中的@是在做什么?它似乎几乎被编译器忽略了。 - Nathan
@PhillipSchmidt 我明白你的意思,我也用过很多RAZOR,但我认为这不是专属于RAZOR的,它可以在普通控制台应用程序中工作。 - Nathan
偶尔我会被SO上学到的东西震惊。感谢@DavidAnderson提供的信息。 - Nathan
我认为原作者可能从另一个应用程序或在线示例中复制了这个语法 - 在同一代码中有其他情况没有它 - 这就是真正困惑我的地方。我以前从未见过这种情况。真正的困难在于你无法轻易地通过谷歌搜索找到这种东西(即使你尝试引用,这个SO上有用的问题也不会被找到,因为@前缀像大多数标点符号一样被丢弃了)。 - Cade Roux
@PhillipSchmidt 这就是它的预期使用方式,但语言规范并不禁止将其放置在非关键字标识符上(并且如果这样做会有注释)。如果规范中不存在该规则,C#编译器团队不会在编译器中强制执行该规则。 :) - David Anderson
显示剩余8条评论

4
你可以在标识符前加上@以将其与保留字等区分开来:
var @class = 1;

(例如,在Razor视图中,@class主要用于指定CSS类。否则,请避免使用这样的名称 :)

在LINQ中也很有用,如from @group in...


在 OP 澄清这不是 Razor 后,我试图撤销我的 -1,但我的投票被锁定了。如果您编辑您的答案(做些微不足道的修改),我会将我的 -1 改为 +1。 - Phillip Schmidt

2

前言:

请不要因为问题描述中提到了一个普通的.cs类而对此进行负面评价。在我写这篇文章的时候,问题描述中没有任何内容表明这不是包含在razor视图中的。考虑到没有上下文信息,这样的情况更有可能发生。

我将保留这个答案,以便其他用户在寻找@的作用时能够找到。

回答:

@是一种从razor视图(.cshtml)访问服务器端变量和方法的方式。

它非常常用于以下情况:

  1. Read session variables:

    @Session["something"]

  2. Access Html helper methods

    @Html.RenderPartial("someview","somecontroller");

  3. Do exactly what you have in the question(though personally I think it's bad practice)

    @ConfigurationManager.AppSettings["whatever"];

  4. Start code blocks and use things like foreach

    @{
        foreach(var item in Model)
        {
            <span class="modelProperty">@Model.SomeTextProperty</span>
        }
    }
    

虽然这可能是真的,但我想知道它是否百分之百准确。它也适用于常规控制台应用程序,请试一试。 - Nathan
谁下了反对票,我想让你重新考虑一下,因为在我写这篇答案的时候,问题中没有提到这段代码存在的位置。 - Phillip Schmidt

0

这里的'@'符号实际上并不是C#运算符。它标志着ASP.NET Razor-syntax代码块的开始。(当然,在您的代码块中有C#代码。)


我不会给你投反对票,因为我忘了这实际上是一个纯粹的C#类,而ASP.NET并没有涉及其中——它是一个普通的C#类,用于Windows服务。 - Cade Roux

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