C#中variables名中@字符的用法/含义是什么?

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

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

我search了VS 2008的c#文档,但无法find任何有关它。 也search谷歌没有给我任何有用的答案。 那么variables/属性名称中“@”字符的确切含义或用法是什么?

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

前缀“@”允许使用关键字作为标识符,这在与其他编程语言进行交互时非常有用。 字符@实际上并不是标识符的一部分,因此标识符可能在其他语言中被看作是普通标识符,而不带前缀。 带有@前缀的标识符称为逐字标识符。

它只是让您使用保留字作为variables名称。 不推荐恕我直言(除非你有例外)。

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

具体来说,它可以用于与保留关键字冲突的variables名称(例如,不能使用参数,但可以使用@params,与out / ref /语言规范中的任何其他关键字一样)。 此外,它可以用于非转义的string文字; 这与path常量特别相关,例如,可以写path = @"c:\temp\somefile.txt"来代替path = "c:\\temp\\somefile.txt" path = @"c:\temp\somefile.txt" 。 这对于正则expression式也是非常有用的。

与Perl的签名不同,C#中的variables名前的@前缀没有任何意义。 如果x是一个variables,@ x是同一个variables的另一个名字。

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

@前缀确实有用处 ,正如你已经发现的那样 – 你可以用它来澄清C#会拒绝的非法的variables名称。

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

@符号允许您使用variables名称的保留关键字。 像int @int,@string,@double等

例如:

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

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

 string public = "This will not compile"; 

它只是允许你使用保留字作为variables名。 那天我想要一个叫做event的变种。 相反,我打算去_event ,但是我的同事提醒我,我可以把它@event

另一个用例是扩展方法。 第一个特殊参数可以用@这个名字来区分它的真实含义。 一个例子:

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

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

您可以使用它来使用保留的关键字作为variables名称

  int @int = 3; 

编译器将忽略@并将该variables编译为int

使用思想不是一个普遍的做法