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

Rem*_*sen 291 c# naming specifications

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

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}
Run Code Online (Sandbox Code Playgroud)

我搜索了VS 2008 c#文档,但找不到任何相关信息.搜索谷歌也没有给我任何有用的答案.那么变量/属性名称中'@'字符的确切含义或用法是什么?

Ati*_*ziz 298

直接来自C#语言规范,标识符(C#) :

前缀"@"允许使用关键字作为标识符,这在与其他编程语言交互时很有用.字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀.带有@前缀的标识符称为逐字标识符.

  • .NET本身没有像这样定义`@`符号,C#语言规范就是这样.自从它的第一个版本C#1.0(随.NET 1.0发布)以来,它一直支持它.http://csharpindepth.com/articles/chapter1/Specifications.aspx (15认同)
  • 对于那些想知道的人,在VB.NET中你可以使用`[]`指定一个逐字标识符,例如`Dim [String] As String`. (8认同)
  • 支持`@`的.NET的目标最小版本是什么? (2认同)

rsl*_*ite 70

它只允许您使用保留字作为变量名.不推荐恕我直言(除非你喜欢的情况).

  • @rslite:+1不推荐:) (6认同)
  • `@ H​​tml.TextboxFor(,,, new {@ class ="my-css-class"})`是一个很好的例子,你无法真正解决它而不必手动编写HTML,或者让javascript更改属性在以后的阶段. (5认同)
  • >*从不*+1不推荐,但永远不要说永远.例如,您可能需要实现使用C#关键字作为标识符的旧COM接口.或者微软可能会在新版本的框架中引入新的关键字 - 例如.NET 1.1债券交易应用程序中的收益率:) (4认同)
  • @Joe:新的`yield`关键字不是保留字,只能在*没有标识符合法出现*的上下文中使用.为C#设计新功能的一个目标是以这样的方式构建它们:在添加新功能之前合法的任何程序在之后都是合法的*并具有相同的含义*. (2认同)

Tom*_*bel 36

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

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


Col*_*nic 12

与Perl的sigils不同@,C#中变量名前面的前缀没有意义.如果x是变量,@x则是同一变量的另一个名称.

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True
Run Code Online (Sandbox Code Playgroud)

但正如您所发现的那样,@前缀确实有用 - 您可以使用它来澄清C#否则会拒绝的变量名称.

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

> string @string;
Run Code Online (Sandbox Code Playgroud)


Uma*_*bas 10

@符号允许您使用保留关键字作为变量名称.像@int,@string,@double等等.

例如:

string @public = "Reserved Keyword used for me and its fine";
Run Code Online (Sandbox Code Playgroud)

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

string public = "This will not compile";
Run Code Online (Sandbox Code Playgroud)


Mar*_*ing 5

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