323

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

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

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

4

9 回答 9

339

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

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

于 2008-09-18T12:24:52.490 回答
81

它只是让您使用保留字作为变量名。恕我直言,不推荐(除非您有这种情况)。

于 2008-09-18T11:45:34.207 回答
38

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

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

于 2008-09-18T12:01:57.477 回答
14

与 Perl 的符号不同@,C# 中变量名前的前缀没有意义。Ifx是一个变量,@x是同一变量的另一个名称。

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

但是正如您所发现的那样,@前缀确实有一个用途- 您可以使用它来阐明 C# 否则会拒绝为非法的变量名称。

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

> string @string;
于 2013-02-15T10:58:08.263 回答
12

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

例如:

string @public = "Reserved Keyword used for me and its fine";

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

string public = "This will not compile";
于 2014-04-03T12:48:39.027 回答
5

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

于 2008-09-18T11:46:42.270 回答
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];
    }
于 2013-12-03T17:43:24.937 回答
1

如果我们使用关键字作为标识符的名称,我们会得到一个编译器错误“identifier expected, 'Identifier Name' is a keyword”。要克服此错误,请在标识符前加上“@”。这样的标识符是逐字标识符。字符 @ 实际上不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀

于 2009-02-24T07:06:25.740 回答
1

您可以使用它来使用保留关键字作为变量名,例如

 int @int = 3; 

编译器将忽略@并将变量编译为int

使用思想不是一种常见的做法

于 2014-02-15T14:26:48.663 回答