C#中变量名称中@字符的用法/含义是什么?
我发现你可以用C#中的'@'字符来启动你的变量名。 在我的C#项目中,我使用的是用Java编写的Web服务(我添加了对我的项目的Web引用)。 WSDL中定义的一个接口对象具有名称为“params”的成员变量。显然,这是C#中的一个保留字,因此您不能拥有带有名称为“params”的成员变量的类。已生成的代理对象包含一个看起来像这样的属性:C#中变量名称中@字符的用法/含义是什么?
public ArrayList @params {
get { return this.paramsField; }
set { this.paramsField = value; }
}
我在VS 2008的C#文件搜查,但没有找到任何关于它。同时搜索谷歌没有给我任何有用的答案。那么变量/属性名称中'@'字符的确切含义或用法是什么?
直起C# Language Specification,§ 2.4.2 Identifiers (C#) :
前缀“@”可以使用 关键字作为标识符,与其他 编程语言建立接口时 有用。字符@ 实际上并不是 标识符的一部分,所以标识符可能是 在其他语言中被看作标准的 标识符,没有前缀。带有@前缀的 标识符称为 逐字标识符。
它只是让您使用保留字作为变量名称。不推荐恕我直言(除非你有例外)。
它只是允许你使用保留字作为变量名。那天我想要一个名为event
的变种。我打算用_event
代替,但我的同事提醒我,我可以将它称为@event
。
在C#中,at(@)字符用于表示明确不符合语言规范中相关规则的文字。
具体而言,它可用于与保留关键字冲突的变量名称(例如,您不能使用参数,但可以使用@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;
另一个用例是扩展方法。第一个特殊参数可以用@this
名称来区分它的真实含义。举个例子:
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> @this,
TKey key,
TValue defaultValue)
{
if ([email protected](key))
{
return defaultValue;
}
return @this[key];
}
你可以用它来使用保留的关键字作为变量名状
int @int = 3;
编译器会忽略@
和编译变量int
它不是一个使用思想的常见做法
@符号允许您为变量名使用保留关键字。如int @int,@string,@double等
例如:
string @public = "Reserved Keyword used for me and its fine";
上面的代码工作正常,但下面不会工作:
string public = "This will not compile";
@rslite:+1不推荐:) – user7116 2008-09-18 12:14:29
+1 +1。永远不会这样做。 – 2008-09-18 12:27:14
> *从不* +1不推荐,但绝不说永不。例如,您可能需要实现一个使用C#关键字作为标识符的传统COM接口。或者,微软可能会在新版本的框架中引入新的关键字 - 例如在.NET 1.1债券交易应用程序中产生收益:) – Joe 2008-09-18 18:15:05