What does the @ symbol before a variable name mean in C#?
Possible Duplicate:
What's the use/meaning of the @ character in variable names in C#?
我理解@符号可以在字符串文字之前使用,以更改编译器解析字符串的方式。但当变量名以@符号作为前缀时,这意味着什么?
- 参见stackoverflow.com/questions/91817
@符号允许您使用保留字。例如:
当以下情况不适用时,上述方法有效:
- 它与下划线有什么不同?
- 使用@符号,名称在程序集中记录为"class",而使用下划线则记录为"_class"。因此,如果另一种.NET语言没有将"class"定义为保留字,那么它们可以只使用"class"这个名称。
- 如果您使用@class作为属性名,您可以这样访问它:myclass.class而不是myclass.u class
- 我想,我可能错了,在这种情况下,删除我的评论
- 约翰,在德尔福,你的评论是准确的。完全限定名不需要"@"或"&;"转义。不过,对C不太确定。
- 当使用反射时,它也显示为"类"。
- 您不应该在公共成员前面加下划线,因为并非所有的.NET语言都支持下划线。
- @罗布:约翰是对的。@迈克尔:很好,简单的解释。+ 1
- 当你认为你知道所有关于C的知识时,你就会学到一些新的东西。:)
- @在ASP.NET MVC中,使用它是很常见的,因为这是表达某些东西的唯一方法。例如,如果你想设置一个元素的class属性,你可以输入new { @class ="mc" };,即使你的意思是"class",这也是唯一的方法。我想说的是,@不是变量实际名称的一部分。
- @肯-谢谢你,我四年前就知道了。:)
- @嘿,别担心,我想。主要目的是通知更多可能阅读此评论的人。
- 这可以用于有美元符号的变量名吗?这样地?@ 100美元
- @欧西里斯355号。美元符号$不是C标识符的有效字符(因为它的Unicode类别)。加上@前缀并不能使带有非法字符的名称合法化。使用@前缀可以使通常被视为关键字的名称(带有有效字符)用作标识符。
- 与一些人的评论相反,这是非常有用的。我有一个WSDL,它将元素名定义为"返回",这允许我在不进行反射的情况下填充它(这正是我所考虑的)。
- 以下是有关@character-docs.microsoft.com/en-us/dotnet/csharp/language-reference/…的Microsoft官方文档链接。
在C中,@符号有两个用途:
首先,它允许您使用保留关键字作为变量,如下所示:
第二个选项允许您指定字符串而不必转义任何字符。例如,""字符是转义字符,因此通常需要这样做:
1
| var myString ="c:\\myfolder\\myfile.txt" |
或者,您可以这样做:
1
| var myString = @"c:\myFolder\myfile.txt" |
- @cybernetitwerkgurorc虽然这是一个更详细的答案,但它超出了OP的要求,标记的答案解决了与变量一起使用时@的特定问题,因此(imo)是更正确的答案。
- 请注意,对于Visual Studio 2015及更高版本,$"a string"允许值插值。所以string.Format("Your value is {0}.", value)现在可以是$"Your value is "{value}"."。您可以将它们组合起来使用文字字符串插值,如$@"Your value is""{value}""."中所示。(注意每个版本中转义双引号的区别。)
- 这是正确的答案!
- 嗨,我如何使用@with pathname?就像var path="c:hahahihi.xls"…我可以使用messagebox.show(@path)吗?
- @罗兰德雷亚斯,你先做var path = @"C:\haha\hihi.xls",然后再做messagebox.show(path)。
- 它如何影响字符串正是我所寻找的。谢谢!
- 谢谢,字符串使用@
- 您仍然需要通过加倍双引号来转义双引号。
- 如果将@放在字符串文字之前,则称为"逐字字符串文字"。
- msdn有一篇关于逐字字符串文本(@"hello")的文章:msdn.microsoft.com/en-us/library/aa691090%28v=vs.71%29.aspx
- 在我看来,这是更好的答案
其他答案忘记的一个重要点是"@keyword"被编译成CIL中的"keyword"。
因此,如果您有一个框架是在(例如)f_中创建的,它要求您用名为"class"的属性定义一个类,那么您实际上可以这样做。
它在实践中并没有那么有用,但如果没有它,将阻止C进行某种形式的语言互操作。
我通常看到它不是用于互操作,而是为了避免关键字限制(通常是在局部变量名上,这是唯一的效果)即。
1 2 3
| private void Foo(){
int @this = 2;
} |
但我强烈反对!只要找到另一个名称,即使变量的"最佳"名称是保留名称之一。
- 这可能是个好建议。我认为@qualifier等价于vb.net的方括号,所以vb的等价物应该是:dim[class]as int32=15
- @它完全等同于vb.net的方括号语法。stackoverflow.com/questions/6639688/…注意到f为相同的目的在标识符周围使用双回线。
- 在MVC中,最新的注释是——"没那么有用"——这是将名为"class"的属性传递给render e的方法——它变成了定义CSS类的HTML"class"。
它允许您使用C关键字作为变量。例如:
1 2 3 4 5
| class MyClass
{
public string name { get; set; }
public string @class { get; set; }
} |