将@放在C#变量名前面会做什么?

时间:2008-10-31 19:33:01

标签: c#

我一直在使用一些C#遗留代码,我在变量名前面看到了很多@符号。这表示或做什么?

目前我在变量前面看到了很多,而这些变量的常用名称并未保留。 E.g:

MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode);

鉴于步骤不是保留字,是否有任何理由要将它们转义?

6 个答案:

答案 0 :(得分:179)

这只是一种允许将保留关键字声明为变量的方法。

void Foo(int @string)

答案 1 :(得分:34)

它允许您使用保留字,例如'public'作为变量名。

string @public = "foo";

我不建议这样做,因为它可能导致不必要的混淆。

答案 2 :(得分:15)

将@放在字符串前面告诉计算机不要处理字符串中找到的转义序列。

来自the documentation

@ -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#关键字匹配的标识符。

你确定你的案子不是第二个吗?