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

Ori*_*ian 135 c#

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

目前我在变量前面看到了很多,其中常见名称没有保留.例如:

MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode);
Run Code Online (Sandbox Code Playgroud)

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

rip*_*234 185

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

void Foo(int @string)
Run Code Online (Sandbox Code Playgroud)

  • 在正常情况下,没有理智的编码员.什么是一些古怪的情况?基于某些规则集自动生成代码时,不希望对保留字具有特殊情况. (10认同)
  • 也许他来自VB背景,其中Step真的是一个关键字. (7认同)
  • 有趣的是,使用变量时不需要使用@可以省略.int @foo = 3; Console.WriteLine(FOO); int bar = 4; Console.WriteLine(@bar); (5认同)
  • 这是有道理的,但是你能想到为什么人们会把它们放在非关键字变量名称前的任何原因 - 除了原来的开发人员是愚蠢的? (3认同)

小智 34

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

string @public = "foo";
Run Code Online (Sandbox Code Playgroud)

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


Gab*_*mbe 15

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

文档:

@ -quoting的优点是不处理转义序列,这使得它易于编写,例如,完全限定的文件名:

@"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"
Run Code Online (Sandbox Code Playgroud)

要在@ -quoted字符串中包含双引号,请将其加倍:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
Run Code Online (Sandbox Code Playgroud)

@符号的另一个用途是使用恰好是C#关键字的引用(/ reference)标识符.有关更多信息,请参见2.4.2标识符.

  • 变量,而不是字符串文字. (7认同)
  • @Orion:是的,它也在最后解释;-) (2认同)
  • 一旦字符串位于变量中,它就已经被转义了,因为必须对其进行解析才能分配给变量,因此将 @ 添加到字符串变量与将其添加到字符串文字不同。 (2认同)

Sti*_*gar 6

@ 符号与与语言关键字相同的标识符一起使用。其主要用途有两个 - 与非 C# 代码互操作。在 VB 或 IronPython 等语言中,关键字与 C# 中的关键字不同,它们可能声明了名称与 C# 关键字匹配的类和属性。如果不存在此功能,则无法在 C# 中访问此代码。- 机器生成的代码。如果代码生成器基于某些外部源(例如 WSDL)生成代码,则生成器只能在所有标识符前添加 @ 前缀,而不会检查和转换与 C# 关键字匹配的标识符。

您确定您的情况不是第二个吗?


Jac*_*ter 5

这会逃避C#中的保留字.