在C#中,变量名前的@符号代表什么意思?

628

我知道 @ 符号可以在字符串字面值前使用,以改变编译器解析字符串的方式。但是,如果变量名以 @ 符号为前缀,这意味着什么?


1
请查看以下链接:https://dev59.com/I3VD5IYBdhLWcg3wGHiu - Simon
4个回答

805

@符号允许您使用保留字。例如:

int @class = 15;

上述方法可行,而下面的方法则不行:

int class = 15;

38
它与下划线相比有什么不同呢? - Vilx-
114
使用@符号时,名称在程序集中被记录为“class”,而使用下划线则是“_class”。因此,如果另一种.NET语言没有将“class”定义为保留字,它们可以只使用名称“class”。 - P Daddy
52
如果你使用了 @class 作为属性名称,你可以这样访问它:MyClass.class,而不是 MyClass._class。 - John Sheehan
3
我认为,我可能会错,如果是这样,请删除我的评论。 - John Sheehan
19
在ASP.net MVC中,非常常见使用@符号,因为这是表达某些内容的唯一方式。例如,如果您想设置元素的class属性,则会键入new { @class = "mc" };,即使您只是想输入"class",也必须这么做。我的观点是,@符号不是变量实际名称的一部分。 - MasterMastic
显示剩余6条评论

477

@符号在C#中有两个用途:

首先,它允许你将保留关键字用作变量,例如:

int @int = 15;
第二个选项允许您指定一个字符串而无需转义任何字符。例如,'\'字符是转义字符,因此通常需要这样做:
var myString = "c:\\myfolder\\myfile.txt"

或者你可以这样做:

var myString = @"c:\myFolder\myfile.txt"

5
您仍然需要通过加倍引号来转义双引号。 - Justin Skiles
1
如果你在字符串字面量前面加上@,它就被称为“逐字字符串字面量”。 - Kamran Bigdely
请注意,使用 Visual Studio 2015 及以上版本,$"a string"允许值插入。因此,string.Format("Your value is {0}.", value) 现在可以写成 $"Your value is \"{value}\"."。您可以将它们组合使用字面字符串插值,例如 $@"Your value is ""{value}""."。(请注意每个版本中双引号转义的差异。) - ErikE

66

其他答案忽略的一个重要点是,在CIL中,“@keyword”编译成“keyword”。

因此,如果您有一个在F#中制作的框架,需要您定义一个名为“class”的属性的类,您实际上可以这样做。

实际上并不是非常有用,但如果没有它,C#将无法进行某些形式的语言互操作性。

我通常看到它用于避免关键字限制(通常在局部变量名称上,在这种情况下,这是唯一的影响),即。

private void Foo(){
   int @this = 2;
}

但我强烈反对这样做!只需找另一个名称,即使“最佳”变量名称是保留名称之一。


5
那可能是个不错的建议。我认为“@”符号限定符相当于VB.Net中的方括号,因此VB等效写法应该是: dim [Class] as Int32 = 15 - Michael Meadows
5
这句话的意思是:“这正好相当于VB.NET中的方括号语法。https://dev59.com/vmw15IYBdhLWcg3wZq1r 指出F#使用双反引号来表示同样的含义。” - ClickRick
4
作为一个晚期的评论 - "并不是非常有用" - 在MVC中,这是你可以将名为"class"的属性传递给渲染器e的方法,该方法会将其转换为html中的"class"来定义CSS类。 - TomTom

17

它允许您将C#关键字用作变量。例如:

class MyClass
{
   public string name { get; set; }
   public string @class { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接