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

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

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

有帮助吗?

解决方案

直接从 C# 语言规范, 标识符 (C#) :

前缀“@”可实现关键字作为标识符,这在与其他编程语言接口时很有用。字符 @实际上不是标识符的一部分,因此可以在没有前缀的情况下以其他语言将标识符视为普通标识符。带有 @前缀的标识符称为逐字标识符。

其他提示

它只是允许您使用保留字作为变量名。恕我直言,不推荐(除非像你这样的情况)。

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

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

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

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

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

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

> string @string;

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

例如:

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

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

string public = "This will not compile";

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

另一个用例是扩展方法。第一个特殊参数可以通过以下方式区分以表示其真正含义 @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];
    }

如果我们使用关键字作为标识符的名称,则会获得一个编译器错误“预期标识符,'标识符名称'是一个关键字”来克服此错误,请将标识符带有“@”。此类标识符是逐字标识符。字符 @ 实际上并不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀

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

 int @int = 3; 

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top