我发现您可以用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];
} |
您可以使用它使用保留关键字作为变量名,例如
编译器将忽略@并将变量编译为int。
使用思想不是一种常见的做法
如果我们使用一个关键字作为标识符的名称,我们会得到一个编译器错误"需要标识符","标识符名称"是一个关键字"要克服此错误,请在标识符前面加"@"。这些标识符是逐字标识符。字符@实际上不是标识符的一部分,因此在其他语言中,标识符可能被视为没有前缀的普通标识符。