在C#中,变量名称中的@字符有什么用/意义?

337

我发现在C#中可以使用'@'字符作为变量名的开头。在我的C#项目中,我使用了一个写在Java中的web服务(我在项目中添加了一个web引用)。WSDL中定义的接口对象之一有一个名为"params"的成员变量。显然,在C#中这是一个保留字,所以你不能使用一个名为"params"的成员变量来定义一个类。生成的代理对象包含了如下代码:

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

我搜索了VS 2008 c#文档但没有找到相关内容,同时在谷歌上也没有得到有用的答案。那么'@'字符在变量/属性名称中的确切含义或用途是什么?

9个回答

351

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

前缀"@"使关键字可以作为标识符使用,这在与其他编程语言交互时非常有用。字符"@"实际上不是标识符的一部分,因此在其他语言中,该标识符可能被视为普通标识符,没有前缀。具有"@"前缀的标识符称为逐字标识符。


2
.NET 支持 @ 的最低版本是什么? - serhio
20
.NET本身并没有像这样定义@符号,而是由C#语言规范来定义。自从它的第一个版本C# 1.0(随.NET 1.0一起发布)开始就支持这个符号。详见http://csharpindepth.com/articles/chapter1/Specifications.aspx。 - Tim S.
11
对于那些想知道的人,在VB.NET中,您可以使用[ ]来指定一个保留标识符,例如Dim [String] As String - MicroVirus

83

它只是允许您将保留字用作变量名。在我看来不推荐这样做(除非您有特殊情况需要这样做)。


9
@rslite:+1 不建议使用 :) - user7116
5
+1 不建议这样做,但切勿说永远不会。例如,您可能需要实现一个使用C#关键字作为标识符的遗留COM接口。或者微软可能会在新版本的框架中引入新的关键字,例如.NET 1.1债券交易应用程序中的yield。 - Joe
2
@Joe:新的yield关键字不是保留字,只能在没有标识符可以合法出现的上下文中使用。设计C#新功能的一个目标是以这样的方式构建它们,即在添加新功能之前合法的任何程序在添加新功能后仍然合法并具有相同的含义 - supercat
7
@Html.TextboxFor( , , , new { @class="my-css-class" } ) 是一个很好的例子,如果不手动编写HTML或稍后使用JavaScript更改属性,则无法避免。 - Flater
在开源软件中,出现了一种新趋势,即在C#代码中所有变量都以“@”符号为前缀。我认为这可能是因为在PHP软件中对变量的要求很熟悉。现在许多开源Web系统都使用C#编写(过去可能是PHP)。 - Wasted_Coder
任何关键字,无论是保留的还是非保留的。从外观上看,“from”是一个非保留的关键字 - 我刚刚看到一些代码,其中一个方法参数被声明为“string from”,但在方法体内它被引用为“@from”,可能是为了防止它被解释为LINQ表达式的开头。 - Stewart

39
在C#中,"@"字符用于表示字面量,这些字面量明确不遵守语言规范的相关规则。
具体来说,它可用于变量名称与保留关键字冲突的情况(例如,无法使用params,但可以使用@params代替,在语言规范中的其他关键字out/ref等也是一样)。此外,它还可用于未转义的字符串字面量。这在路径常量中特别重要,例如,您可以将path = "c:\\temp\\somefile.txt"写成path = @"c:\temp\somefile.txt"。它对于正则表达式也非常有用。

有趣的一点(也是一个有用的助记符)是“verbatim-”或“here-strings”之间的约定与参数命名相同。 - ruffin

15

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

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

但是,正如您已经发现的那样,@前缀确实有其 用途 - 您可以使用它来澄清变量名称,否则C#将拒绝其作为非法。

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

> string @string;

14
@符号允许您在变量名中使用保留关键字,例如@int@string@double等。
例如:
string @public = "Reserved Keyword used for me and its fine";

上述代码运行正常,但下面的代码将无法运行:

string public = "This will not compile";

5

这只是让您可以将保留字用作变量名。有一天我想要一个名为event的变量。我本来打算使用_event,但我的同事提醒我可以直接使用@event


3

另一个用例是扩展方法。第一个特殊参数可以通过@this名称来区分其真正的含义。例如:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

1
你可以使用它将保留关键字用作变量名,例如:
 int @int = 3; 

编译器会忽略 @,并将变量编译为 int
使用思考不是常见的做法。

1

如果我们使用关键字作为标识符的名称,我们会得到编译器错误“需要标识符,'标识符名称'是关键字”。 为了克服这个错误,可以在标识符前加上“@”。这样的标识符是逐字标识符。 字符@实际上不是标识符的一部分,因此在其他语言中,可能会将该标识符视为正常标识符,而不带前缀。


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