@C#中标识符的前缀
本文关键字:前缀 标识符 @C# | 更新日期: 2023-09-27 18:19:44
允许将"@"字符作为前缀,以便将关键字用作标识符。大多数.net开发人员都知道这一点。
但我们可能不知道:如果删除"@"前缀后,两个标识符相同,则视为相同。
所以
static void Main(string[] args)
{
int x = 123;
Console.WriteLine(@x);
}
是绝对有效的代码,并将123打印到控制台。
我很好奇为什么我们在规范中有这样的规则,以及这个功能在现实世界中是如何使用的(如果标识符不是关键字,用"@"前缀是没有意义的,对吧?)。
这完全符合逻辑。@
不是名称的一部分,而是一个特殊的指示符,不将后面的内容视为关键字,而将其视为标识符。
Eric Lippert有一篇关于它的非常好的文章:逐字标识符
我偶尔会被问到,为什么任何标识符都可以被逐字逐句的标识符为什么不将逐字标识符限制为保留关键字和上下文关键字
答案很简单。想象一下,我们又回到了过去当C#2.0刚刚发布时。您有一个使用yield的C#1.0程序作为一个标识符,这是完全合理的;"收益"是常见的术语在许多商业和科学应用中。现在,C#2.0精心设计的C#1.0程序标识符仍然是合法的C#2.0程序;它只有它的特色意思是当它出现在返回之前,而这在C中从未发生过#1.0程序。但是,您仍然决定将程序中yield的用法标记为逐字标识符,以便让代码的未来读者更清楚地知道,它被用作标识符,而不是迭代器的一部分
让我们考虑一个生成C#
代码的程序的例子——例如,它获取数据库表中的列,并创建一个可比较的C# POCO
对象,每个列有一个属性。
如果其中一个列名与C#
关键字匹配怎么办?如果所有属性名称都以@
为前缀,则代码生成器不必记住哪些单词是关键字
这是一个故障保险。额外的@
字符一点也不影响代码!!
其他答案都很清楚为什么存在这种行为,但我认为可能值得研究标识符被视为相等的规则。
引用规范第2.4.2节:
如果在应用以下转换后,两个标识符相同,则视为相同,按顺序:
- 前缀"@"(如果使用)将被删除
- 每个unicode转义序列都被转换为相应的unicode字符
- 任何格式字符都将被删除
遵循这些规则,@x
与x
是相同的。
它提供了确定性:
- 使用@word是经得起未来考验的。
如果以后成为关键字,则不需要进行任何更改 - 大多数程序员不会熟悉每一个关键词(C#大约有100个关键词)
- 最近的关键词是"上下文",所以有时它们不是关键词