【问题标题】:What's the use/meaning of the @ character in variable names in C#?C# 中变量名中 @ 字符的用途/含义是什么?
【发布时间】:2010-09-10 15:31:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# variables naming specifications reserved-words


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      直接来自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.
      【解决方案3】:

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

      例如:

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

      上面的代码可以正常工作,但下面的代码就不行了:

      string public = "This will not compile";
      

      【讨论】:

        【解决方案4】:

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

         int @int = 3; 
        

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 有趣的一点(和有用的助记符)“verbatim-”或“here-strings参数命名之间的约定是相同的。
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

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