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

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

我搜索了VS 2008 c#文档,但没有找到任何关于它的东西。而且搜索谷歌也没有给我任何有用的答案。那么“@”字符在变量/属性名中的确切含义或用途是什么?


当前回答

在c#中,at(@)字符用于表示显式不遵守语言规范中相关规则的文字。

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

其他回答

与Perl的符号不同,在c#中变量名之前的@前缀没有任何意义。如果x是一个变量,@x是同一变量的另一个名称。

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

但是@前缀确实有一个用途,正如你所发现的那样——你可以用它来澄清c#会拒绝的变量名,否则它们是非法的。

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

> string @string;

在c#中,at(@)字符用于表示显式不遵守语言规范中相关规则的文字。

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

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

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

它只是允许您使用保留字作为变量名。恕我直言,不推荐(除非像你这样的情况)。