关于命名:C#中变量名中@字符的用法/含义是什么?

What's the use/meaning of the @ character in variable names in C#?

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

1
2
3
4
public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

我搜索了VS 2008 C文档,但找不到任何相关信息。搜索谷歌也没有给我任何有用的答案。那么变量/属性名中"@"字符的确切含义或用法是什么?


直接从C语言规范,标识符(C):

The prefix"@" enables the use of
keywords as identifiers, which is
useful when interfacing with other
programming languages. The character @
is not actually part of the
identifier, so the identifier might be
seen in other languages as a normal
identifier, without the prefix. An
identifier with an @ prefix is called
a verbatim identifier.


它只允许您使用保留字作为变量名。不建议使用imho(除非您这样做)。


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

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


与Perl的sigils不同,c中变量名前面的@前缀没有意义。如果x是变量,那么@x是同一变量的另一个名称。

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

但是,正如您发现的那样,@前缀确实有一个用途——您可以使用它来澄清变量名,否则C将拒绝该变量名为非法变量。

1
2
3
4
> string string;
Identifier expected; 'string' is a keyword

> string @string;

@符号允许您为变量名使用保留关键字。如@int@string@double等。

例如:

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

上面的代码工作正常,但下面的代码不工作:

1
string public ="This will not compile";

它只允许您使用保留字作为变量名。前几天我想要一个名为event的var。我本来打算和_event一起去,但我的同事提醒我,我可以把它叫做@event


另一个用例在扩展方法中。第一,特殊参数可以用@this名称来表示其真实含义。一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
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
 int @int = 3;

编译器将忽略@并将变量编译为int

使用思想不是一种常见的做法


如果我们使用一个关键字作为标识符的名称,我们会得到一个编译器错误"需要标识符","标识符名称"是一个关键字"要克服此错误,请在标识符前面加"@"。这些标识符是逐字标识符。字符@实际上不是标识符的一部分,因此在其他语言中,标识符可能被视为没有前缀的普通标识符。