ChatGPT解决这个技术问题 Extra ChatGPT

C# 中变量名中 @ 字符的用途/含义是什么?

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

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

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


S
Sampath Dilhan

直接来自 C# Language SpecificationIdentifiers (C#)

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


支持 @ 的 .NET 的目标最小版本是什么?
.NET 本身并没有像 C# 语言规范那样定义 @ 符号。它从第一个版本 C# 1.0(与 .NET 1.0 一起发布)开始支持这一点。 csharpindepth.com/articles/chapter1/Specifications.aspx
对于那些想知道的人,在 VB.NET 中,您可以使用 [ ] 来指定逐字标识符,例如 Dim [String] As String
r
rslite

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


@rslite:+1 不推荐 :)
> 从不 +1 不推荐,但永远不要说从不。例如,您可能需要实现使用 C# 关键字作为标识符的旧 COM 接口。或者微软可能会在新版本的框架中引入新的关键字——例如在 .NET 1.1 债券交易应用程序中的收益 :)
@Joe:新的 yield 关键字不是保留字,只能在没有标识符可以合法出现的上下文中使用。为 C# 设计新功能时的一个目标是以这样一种方式构造它们,即在添加新功能之前合法的任何程序在添加新功能之前将是合法的并具有相同的含义
@Html.TextboxFor( , , , new { @class="my-css-class" } ) 是一个很好的示例,您必须手动编写 HTML 或让 javascript 在稍后阶段更改属性,才能真正绕过它。
在开源软件中出现了一种新趋势,在 C# 代码中所有变量都以“@”符号为前缀。我相信这可能是因为 PHP 软件中对变量的这种要求很熟悉。现在许多开源 Web 系统都是用 C# 编码的(过去是 PHP)
F
Faust

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

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


有趣的一点(和有用的助记符),“verbatim-”或“here-strings参数命名之间的约定是相同的。
C
Colonel Panic

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

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

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

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

> string @string;

U
Umar Abbas

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

例如:

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

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

string public = "This will not compile";

M
Mark Embling

它只是允许您使用保留字作为变量名。前几天我想要一个名为 event 的变量。我本来打算改用 _event,但我的同事提醒我,我可以直接将其称为 @event


B
BartoszKP

另一个用例是扩展方法。第一个特殊参数可以用 @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];
    }

r
raji vineeth

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


M
Mina Gabriel

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

 int @int = 3; 

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

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