我发现您可以在 C# 中以“@”字符开头变量名。在我的 C# 项目中,我使用了一个用 Java 编写的 Web 服务(我向我的项目添加了一个 Web 引用)。 WSDL 中定义的接口对象之一有一个名为“params”的成员变量。显然,这是 C# 中的保留字,因此您不能拥有具有名称为“params”的成员变量的类。生成的代理对象包含如下所示的属性:
public ArrayList @params {
get { return this.paramsField; }
set { this.paramsField = value; }
}
我搜索了 VS 2008 c# 文档,但找不到任何相关信息。也搜索谷歌并没有给我任何有用的答案。那么变量/属性名称中“@”字符的确切含义或用法是什么?
直接来自 C# Language Specification、Identifiers (C#):
前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符 @ 实际上不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀。带有@ 前缀的标识符称为逐字标识符。
它只是让您使用保留字作为变量名。恕我直言,不推荐(除非您有这种情况)。
yield
关键字不是保留字,只能在没有标识符可以合法出现的上下文中使用。为 C# 设计新功能时的一个目标是以这样一种方式构造它们,即在添加新功能之前合法的任何程序在添加新功能之前将是合法的并具有相同的含义。
@Html.TextboxFor( , , , new { @class="my-css-class" } )
是一个很好的示例,您必须手动编写 HTML 或让 javascript 在稍后阶段更改属性,才能真正绕过它。
在 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
但是正如您所发现的,@
前缀确实有一个 use - 您可以使用它来阐明 C# 否则会拒绝为非法的变量名称。
> string string;
Identifier expected; 'string' is a keyword
> string @string;
@
符号允许您使用保留关键字作为变量名。像 @int
、@string
、@double
等。
例如:
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];
}
如果我们使用关键字作为标识符的名称,我们会得到一个编译器错误“identifier expected, 'Identifier Name' is a keyword”。要克服此错误,请在标识符前加上“@”。这样的标识符是逐字标识符。字符 @ 实际上不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀
您可以使用它来使用保留关键字作为变量名,例如
int @int = 3;
编译器将忽略 @
并将变量编译为 int
使用思想不是一种常见的做法
不定期副业成功案例分享
@
的 .NET 的目标最小版本是什么?@
符号。它从第一个版本 C# 1.0(与 .NET 1.0 一起发布)开始支持这一点。 csharpindepth.com/articles/chapter1/Specifications.aspx[ ]
来指定逐字标识符,例如Dim [String] As String
。