C#中变量名中@字符的用途/含义是什么?


298

我发现可以在C#中以'@'字符开头变量名。在我的C#项目中,我使用的是用Java编写的Web服务(向项目中添加了Web引用)。WSDL中定义的接口对象之一具有名为“ params”的成员变量。显然,这是C#中的保留字,因此您不能有一个带有成员变量的类,其名称为“ params”。生成的代理对象包含一个如下所示的属性:

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

我搜索了VS 2008 c#文档,但找不到任何相关信息。另外,搜索Google并没有给我任何有用的答案。那么,变量/属性名称中“ @”字符的确切含义或用途是什么?

Answers:


306

直接来自C#语言规范标识符(C#)

前缀“ @”允许使用关键字作为标识符,这在与其他编程语言接口时非常有用。字符@实际上不是标识符的一部分,因此该标识符在其他语言中可能被视为普通标识符,没有前缀。具有@前缀的标识符称为逐字标识符。


2
.NET支持的最低目标版本是@什么?
serhio

16
.NET本身并不@像C#语言规范那样定义符号。自从其第一个版本C#1.0(随.NET 1.0发行)以来,它就一直对此提供支持。csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.

9
对于那些想知道的人,可以在VB.NET中使用[ ]逐字标识符,例如Dim [String] As String
MicroVirus

74

它只是让您使用保留字作为变量名。不推荐恕我直言(除非您有这种情况)。


6
@rslite:+1不推荐:)
user7116

4
> 从不 +1不推荐,但从不说不。例如,您可能需要实现使用C#关键字作为标识符的旧式COM接口。否则,Microsoft可能会在框架的新版本中引入新的关键字-例如,.NET 1.1债券交易应用程序中的收益:)

2
@Joe:new yield关键字不是保留字,仅在无法合法显示标识符的情况下可用。为C#设计新功能的一个目标是,以这样一种方式构造它们:任何在添加新功能之前合法的程序,之后将是合法的,并且具有相同的含义
2013年

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )这是一个很好的例子,您无需手动编写HTML或在以后的阶段中用javascript更改属性就无法真正解决它。
2014年

在开源软件中看到了一种新趋势,其中所有变量在C#代码中均以“ @”符号开头。我相信这可能是由于PHP软件对变量的这一要求很熟悉。现在许多开放源代码Web系统都用C#编码(过去是PHP)
Wasted_Coder

36

在C#中,at(@)字符用于表示明显不符合语言规范中相关规则的文字。

具体来说,它可以用于与保留关键字冲突的变量名(例如,您不能使用params,但可以使用@params,与语言规范中的out / ref /任何其他关键字相同)。另外,它可以用于未转义的字符串文字;这与路径常数特别相关,例如,path = "c:\\temp\\somefile.txt"可以代替编写path = @"c:\temp\somefile.txt"。对于正则表达式也非常有用。


有趣的一点(有用的助记符)是“ verbatim-”或“ here-strings参数命名之间的约定相同。
鲁芬

13

与Perl的信号不同@,C#中的变量名之前的前缀没有意义。如果x是变量,@x则是同一变量的另一个名称。

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

但是,正如您所发现的那样,@前缀确实有一个use-您可以使用它来阐明C#否则会拒绝视为非法的变量名称。

> string string;
Identifier expected; 'string' is a keyword

> string @string;

10

@符号允许您将保留关键字用作变量名。像@int@string@double等等。

例如:

string @public = "Reserved Keyword used for me and its fine";

上面的代码可以正常工作,但是下面的代码不起作用:

string public = "This will not compile";

4

它只是允许您将保留字用作变量名。我前event几天想要一个变种。我本来打算去的_event,但是我的同事提醒我可以改成它了@event


3

另一个用例是扩展方法。可以区分第一个特殊参数,以@this名称表示其实际含义。一个例子:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

1

如果使用关键字作为标识符的名称,则会出现编译器错误“期望标识符,'标识符名称'是关键字”。要克服此错误,请在标识符前面加上“ @”。这样的标识符是逐字标识符。字符@实际上不是标识符的一部分,因此该标识符在其他语言中可能被视为普通标识符,没有前缀


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.