我一直在使用一些C#遗留代码,我在变量名前面看到了很多@符号。这表示或做什么?
目前我在变量前面看到了很多,而这些变量的常用名称并未保留。 E.g:
MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode);
鉴于步骤不是保留字,是否有任何理由要将它们转义?
答案 0 :(得分:179)
这只是一种允许将保留关键字声明为变量的方法。
void Foo(int @string)
答案 1 :(得分:34)
它允许您使用保留字,例如'public'作为变量名。
string @public = "foo";
我不建议这样做,因为它可能导致不必要的混淆。
答案 2 :(得分:15)
将@放在字符串前面告诉计算机不要处理字符串中找到的转义序列。
@ -quoting的优点是不处理转义序列,这使得它易于编写,例如,完全限定的文件名:
@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"
要在@ -quoted字符串中包含双引号,请将其加倍:
@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
@符号的另一个用途是使用恰好是C#关键字的引用(/ reference)标识符。有关详细信息,请参阅2.4.2 Identifiers。
答案 3 :(得分:5)
这会逃避C#中的保留字。
答案 4 :(得分:3)
原始问题询问为什么人们会逃避一个非保留字。我想到的是,如果step
将来成为一个保留字,代码示例仍然会编译。我想它也是代码生成器的有效选项。
答案 5 :(得分:2)
@符号用于与语言关键字相同的标识符。这有两个主要用途 - 与非C#代码互操作。在VB或IronPython等语言中,关键字与C#中的关键字不同,它们可能声明了名称与C#关键字匹配的类和属性。如果此功能不存在,则无法在C#中访问此代码。 - 机器生成的代码。如果代码生成器基于某些外部源(例如WSDL)生成代码,则生成器可以使用@前缀所有标识符,而不检查和转换与C#关键字匹配的标识符。
你确定你的案子不是第二个吗?