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#)

前缀“@”可以使用 关键字作为标识符,与其他 编程语言建立接口时 有用。字符@ 实际上并不是 标识符的一部分,所以标识符可能是 在其他语言中被看作标准的 标识符,没有前缀。带有@前缀的 标识符称为 逐字标识符。

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

+5

@rslite:+1不推荐:) – user7116 2008-09-18 12:14:29

+2

+1 +1。永远不会这样做。 – 2008-09-18 12:27:14

+4

> *从不* +1不推荐,但绝不说永不。例如,您可能需要实现一个使用C#关键字作为标识符的传统COM接口。或者,微软可能会在新版本的框架中引入新的关键字 - 例如在.NET 1.1债券交易应用程序中产生收益:) – Joe 2008-09-18 18:15:05

它只是允许你使用保留字作为变量名。那天我想要一个名为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";