C# 为什么是'@';当任何成员变量(即调用函数/属性)不';t影响它的价值?
我知道如上所述,C#中使用@关键字的目的不同,但我的问题不同 假设我使用C# 为什么是'@';当任何成员变量(即调用函数/属性)不';t影响它的价值?,c#,asp.net,C#,Asp.net,我知道如上所述,C#中使用@关键字的目的不同,但我的问题不同 假设我使用@ConfigurationManager.AppSetting[“DbConnectionString”]代替ConfigurationManager.AppSetting[“DbConnectionString”]。它仍然以同样的方式工作 因此,我的问题是: 为什么这里的编译器允许使用“@”符号而不影响其值 “@”符号能否在上述任何情况下更改值 为了更清楚,我想再添加一个示例: 假设我有一个类'Configuration
@ConfigurationManager.AppSetting[“DbConnectionString”]
代替ConfigurationManager.AppSetting[“DbConnectionString”]
。它仍然以同样的方式工作
因此,我的问题是:
'ConfigurationLoader'
,它有一个静态函数'GetConfigurations'
返回字符串列表
然后,我可以将其称为List ConnectionStrs=ConfigurationLoader.GetConfigurations()代码>
如果我将其设置为List ConnectionStrs=@ConfigurationLoader.GetConfigurations()代码>然后它仍然给出相同的结果。在这种情况下,我要问以上两个问题。你提到的问题回答了你的问题。在此上下文中,@
告诉编译器下一个符号是标识符,而不是关键字。对于ConfigurationManager
,您不需要它,但它仍然可以使用。以下是一个需要的示例:
class @class
{
public @class()
{
}
}
class Program
{
static void Main(string[] args)
{
@class c = new @class();
}
}
您可以使用@
符号将保留关键字用作简单变量名,例如:
int @for = 10;
Console.WriteLine(@for); // 10
同样,您可以使用名为@hello
的变量来代替hello
,即使hello
不是需要@
前缀才能用作变量名的保留关键字
编辑以说明不用于保留关键字时允许使用的真正原因
两个可能的原因:
@
应该只在保留关键字(和转义字符串)上被允许,但是有人忘记了一个,而其他人则不在乎
@
应该被允许在保留的关键字上使用,而且没有人关心它是否也会以其他方式使用
从大量的评论中你可能可以看出,你的问题并没有一个好的、令人满意的答案。不过,我会尝试一下:
1。在不影响其值的情况下,编译器为什么允许此处使用“@”符号?
因为语言规范就是这么说的。标记前的@符号并不意味着“下一个标记是关键字,但将其视为标识符”。规范不是这样编写的,因此语言编译器也不是这样工作的。相反,它意味着“无论下一个标记是什么,都要将其视为标识符,即使它恰好是一个关键字”
这和说“假装蓝色是一种颜色”是一样的。这很容易做到,因为蓝色是一种颜色。类似地,说“假装myCollection
不是C#关键字”很容易——它不是C#关键字,所以没什么可做的
我想你真正想问的是:
1b。为什么设计C#的人会这样定义@
符号的行为?
恐怕只有帮助定义C的人才能回答这个问题。我们可以猜测,答案几乎肯定会是一些人已经评论过的答案:因为这种方式更容易(解释、记录、实现、测试等),而且没有任何负面影响。嗯,除了一些开发人员的一些轻微困惑之外。:)
在规范中添加一个要求,即编译器在“滥用”@
符号时执行某些操作,这意味着需要做大量的工作。你必须定义它的功能(是警告吗?错误?),你必须向规范中添加正确、准确、校对、明确的语言,你必须向编译器中添加代码以产生新的行为,你必须记录新的行为,你必须编写测试脚本来执行新的行为,等等。所有这些都是为了“功能”这没有任何额外的好处
它确实使用了@redundant,但由于各种原因,C#允许您做很多冗余的事情。您可以添加冗余的()
,您可以添加冗余的委托构造函数,您可以添加冗余的辅助功能关键字。而且,正如您所看到的,如果您愿意,您可以到处添加冗余的@
2。“@”符号能否在上述任何情况下更改值?
这一个,我们可以回答:不。如果你把@
放在一个已经是标识符的标记之前,它将被视为一个标识符——编译器无论如何都要引用的标识符。你看不到行为上的任何变化,只是额外的输入。更新:这个问题是。谢谢你的提问
“@”符号能否在上述任何情况下更改值
没有
我们正在谈论的功能是什么
在C#中,如果在任何标识符前面加上@
,则该标识符是允许的,但不要求是关键字。此功能允许开发人员使用保留关键字作为标识符:
static void M(bool @unsafe) { ... }
它允许您强调,可能与上下文关键字混淆的标识符实际上是一个标识符:
@yield = 123.45;
如果没有@
,这将是合法的,但它清楚地表明,开发商的意思不是收益率为123.45代码>这里
那么,为什么不允许在非关键字的标识符上使用它呢
让我们进入wayback机器,回到C#2.0的世界。假设该功能就是您建议的方式:@
只能用于保留关键字和上下文关键字。你用C#2.0编写这个程序:
这是一个合法的C#2.0程序,而不是一个合法的C#1程序,这不是有点奇怪吗
class P
{
static void Main()
{
int @yield = 123;
}
}