C#中的@语法是什么?

3
6个回答

8

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

示例:

class @class
{
   public static void @static(bool @bool) {
      if (@bool)
         System.Console.WriteLine("true");
      else
         System.Console.WriteLine("false");
   }   
}
参见:http://msdn.microsoft.com/en-us/library/aa664670.aspx

2

它允许您将保留关键字用作标识符。例如,我经常遇到的一个常见情况是在定义锁对象时使用。

object lock = new object(); // this would throw a compiler error as `lock` is a reserved word.

所以我必须在前缀中加上@符号,告诉编译器这不是类型而是字面量。
object @lock = new object();

顺便说一下,如果你的标识符描述不够详细,就会出现这样的冲突,这通常是一个很好的指示器。


请您能否举个例子,我还没有完全理解。 - guyl

1
这是因为在C#中,object是一个受保护的关键字。@符号告诉编译器那应该是变量名,而不应与object关键字混淆。

0

它的意思是“字面”,即“这个名称不是关键字或类型标识符”。如果没有它,object将被视为一种类型。


0

关键字是预定义的保留标识符,对编译器具有特殊含义。除非它们包括@作为前缀,否则不能在程序中用作标识符。例如,@if是一个合法的标识符,但 if 不是因为它是一个关键字。

请参考C# 关键字


0

请查看这个问题中我的答案。

@符号允许您在变量名中使用保留字

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }

我不同意Resharper是“错误”的说法。它只是将其标记出来,因为使用编译器关键字(无论是保留的还是上下文相关的)作为变量名可能不是最佳方法。 - James
我同意,根本不应该以编译器关键字命名变量,但我认为如果这不是最佳方法,就让它报错,而不是试图修复所有这些问题,特别是那些甚至不会导致任何错误的问题! ;) - Connell

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