关于命名:C#中变量名中@字符的用法/含义是什么?

关于命名:C#中变量名中@字符的用法/含义是什么?

What's the use/meaning of the @ character in variable names in C#?

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

1
2
3
4
public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

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


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

The prefix"@" enables the use of
keywords as identifiers, which is
useful when interfacing with other
programming languages. The character @
is not actually part of the
identifier, so the identifier might be
seen in other languages as a normal
identifier, without the prefix. An
identifier with an @ prefix is called
a verbatim identifier.


它只允许您使用保留字作为变量名。不建议使用imho(除非您这样做)。


在C中,at(@)字符用于表示显式不符合语言规范中相关规则的文本。

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


与Perl的sigils不同,c中变量名前面的@前缀没有意义。如果x是变量,那么@x是同一变量的另一个名称。

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

但是,正如您发现的那样,@前缀确实有一个用途——您可以使用它来澄清变量名,否则C将拒绝该变量名为非法变量。

1
2
3
4
> string string;
Identifier expected; 'string' is a keyword

> string @string;

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

例如:

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

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

1
string public ="This will not compile";

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


另一个用例在扩展方法中。第一,特殊参数可以用@this名称来表示其真实含义。一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

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

1
 int @int = 3;

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

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


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


推荐阅读

    纯命令行linux服务器?

    纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,

    重启服务linux命令?

    重启服务linux命令?,网络,系统,服务,设备,工作,标准,名称,工具,命令,管理,Lin

    linux输出字符串命令?

    linux输出字符串命令?,标准,基础,字符串,资料,简介,商业,数字,系统,命令,汉

    linux下命令访问服务?

    linux下命令访问服务?,服务,密码,状态,信息,地址,网络,认证,系统,号码,名称,l

    检查linux服务器命令?

    检查linux服务器命令?,系统,信息,状态,情况,时间,工具,网络,环境,服务,电脑,

    linux命令替换的字符?

    linux命令替换的字符?,命令,数据,系统,商业,字符串,文件,内容,方法,批量,字

    linux命令引用文件名?

    linux命令引用文件名?,工作,系统,信息,命令,数据,文件,时间,灵活,名称,标准,l

    linux命令删除字符串?

    linux命令删除字符串?,软件,系统,代码,名称,通用,连续,字符,字符串,命令,空

    linux打包项目命令?

    linux打包项目命令?,项目,文件,命令,软件,数字,系统,名称,工具,目录,格式,Lin

    linux项目更新命令行?

    linux项目更新命令行?,工作,地址,系统,数据,信息,项目,标准,电脑,目录,命令,l

    linux7关闭服务命令?

    linux7关闭服务命令?,系统,软件,服务,命令,电脑,状态,工具,管理,进程,用户,求

    linux服务器域名命令?

    linux服务器域名命令?,地址,信息,系统,网络,服务,环境,名称,网站,管理,电脑,l

    服务启动linux命令?

    服务启动linux命令?,服务,密码,信息,系统,名称,命令,文件,用户,下面,服务器,l

    linux服务器命令框?

    linux服务器命令框?,系统,情况,状态,信息,数据,软件,指标,服务,在线,工具,lin

    服务器linux命令教程?

    服务器linux命令教程?,系统,地址,密码,网络,设备,工作,服务,标准,连续,管理,

    linux命令行字符隐藏?

    linux命令行字符隐藏?,系统,标准,信息,名称,代码,工具,文件夹,命令,文件,语

    linux转换字符集命令?

    linux转换字符集命令?,系统,名称,时间,位置,服务,文件,字符集,命令,格式,以

    linux删除服务的命令?

    linux删除服务的命令?,服务,系统,软件,平台,名称,管理,环境,产品,命令,文件,

    linux开机服务命令行?

    linux开机服务命令行?,系统,工作,地址,信息,服务,设备,数字,第一,设计,发行,l

    linux服务器分区命令?

    linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,l