我知道'@'关键字在C#中用于不同的目的,如这里所讨论的,但我的问题是不同的.
假设我用来@ConfigurationManager.AppSetting["DbConnectionString"]
代替ConfigurationManager.AppSetting["DbConnectionString"]
.它仍然以相同的方式工作.
所以我的问题是:
为了更清楚,我想再添加一个示例:
假设,我有一个'ConfigurationLoader'
具有静态函数的类'GetConfigurations'
返回一个字符串列表.
然后,我可以称之为List<string> ConnectionStrs=ConfigurationLoader.GetConfigurations();
.
如果我这样做List<string> ConnectionStrs=@ConfigurationLoader.GetConfigurations();
它仍然会给出相同的结果.在这样的场景中,我问上面两个问题.
Eri*_*ert 24
更新:这个问题是我2013年9月的博客主题.谢谢你这个好问题!
如上所述,'@'符号可以改变任何场景中的值吗?
没有.
我们谈论的是什么功能?
在C#中,如果您使用任何标识符@
作为前缀,则允许使用标识符,但不要求必须是关键字.此功能允许开发人员使用保留关键字作为标识符:
static void M(bool @unsafe) { ... }
Run Code Online (Sandbox Code Playgroud)
它允许您强调可能与上下文关键字混淆的标识符实际上是一个标识符:
@yield = 123.45;
Run Code Online (Sandbox Code Playgroud)
如果没有@
它,这将是合法的,但它清楚地表明开发人员并不yield return 123.45;
在这里.
那么为什么允许使用不是关键字的标识符呢?
让我们进入回归机器,回到C#2.0的世界.让我们假设的特点是你建议的方式:@
可以只去保留和上下文关键字.你用C#2.0编写这个程序:
class P
{
static void Main()
{
int @yield = 123;
}
}
Run Code Online (Sandbox Code Playgroud)
尽管不使用C#2.0的功能,这是一个合法的C#2.0程序但不是合法的C#1.0程序似乎有点奇怪吗?
设计的功能允许您在使用不同版本的C#的两个团队之间共享代码.它允许你让团队中的一个人试用C#2.0,看看它是否有效,而其他人仍在使用C#1.0.您提出的功能会使这两种情况变得噩梦,并为采用新版本的语言带来了障碍.升级已经足够昂贵了; 语言设计团队不想让它变得更加昂贵.
设计的功能还可以实现"面向未来".假设您正在编写一个生成其他程序的程序.您也可以将生成的程序作为其所有标识符的前言,@
因为您不知道在未来的C#版本中哪些单词将成为关键字.
我在哪里可以阅读有关C#关键字规则的更多信息?
http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/
正如你可以从大量评论中看到的那样,对你的问题没有一个好的,令人满意的答案.不过我会尝试一下:
1.为什么编译器在不影响其值的情况下允许使用'@'符号?
因为这就是语言规范所说的.令牌之前的@符号并不意味着"下一个令牌是关键字,但将其视为标识符".这不是规范的编写方式,因此不是语言编译器的工作方式.相反,它意味着"无论下一个标记是什么,将其视为标识符,即使它恰好是关键字".
例如,"假装蓝色是一种颜色"就是这么说的.这很容易做到,因为蓝色是一种颜色.类似地说"假装myCollection
不是C#关键字"很容易 - 它不是 C#关键字,所以没什么可做的.
我怀疑,你真正想要问的是:
1B.为什么设计C#的人以@
这种方式定义符号的行为?
那个问题,我担心,只有帮助定义C#的人才能回答.我们可以猜测,答案肯定会是几个人已经评论过的答案:因为这种方式更容易(解释,记录,实施,测试等)并且没有任何缺点.好吧,除了一些开发人员的一些轻微的混乱.:)
在规范中添加一个要求,即编译器在"滥用" @
符号时执行某些操作意味着需要做很多工作.你必须定义它的作用(它是一个警告吗?错误?),你必须在规范中添加正确,准确,校对,明确的语言,你必须将代码添加到编译器中以产生新的行为,你必须记录新的行为,你必须编写测试脚本来行使新的行为,等等.所有的"功能"都没有额外的好处.
它确实使用了@ redundant,但是由于各种原因,C#允许你做很多冗余的事情.您可以添加冗余()
,可以添加冗余委托构造函数,可以添加冗余可访问性关键字.而且,正如您所看到@
的,如果您愿意,可以在整个地方添加冗余.
2.如上所述,'@'符号可以改变任何场景中的值吗?
这个,我们可以回答:不.如果你放在@
一个已经是标识符的令牌之前,它将被视为一个标识符 - 无论如何编译器将要引用的完全相同的标识符.你不会看到任何行为的变化,这只是额外的打字.