字符串插值-大括号内的@符号做什么?

时间:2018-08-31 08:57:03

标签: c# .net

考虑:

string newline = "\r\n";

Console.WriteLine($"Hello without at{newline}how are you?");
Console.WriteLine($"Hello with at{@newline}how are you?");

两行的输出相同。换行符总是打印为换行符。

Hello without at
how are you?
Hello with at
how are you?

那么什么时候需要花括号中的 符号?

2 个答案:

答案 0 :(得分:30)

$"Hello { myValue }"是在C#6中引入的内插字符串。在您的情况下,这等效于对String.Format("Hello {0}", myValue)的调用。

当您的变量与关键字具有相同的名称时,就需要逐字(@),据我所知,newline不是。但是,以下内容会导致编译器错误:

String.Format("Hello {0}", if)

这不会:

String.Format("Hello {0}", @if)

这里的逐字记录告诉编译器if变量的名称,而不是if-关键字

因此,您不需要逐字记录,因为newline不是关键字。换句话说,您的代码与此等效:

Console.WriteLine("Hello with at{0}how are you?", @newline);

这是逐字的有效使用(即使是多余的)。

有关更多信息,请参见documentation about string-interpolation

答案 1 :(得分:15)

这是一个多余的逐字词前缀。来自C# specification

  

使用前缀“ @”可以将关键字用作标识符,这在与其他编程语言进行接口时非常有用。字符@实际上不是标识符的一部分,因此在其他语言中,标识符可能被视为普通标识符,没有前缀。具有@前缀的标识符称为逐字标识符。允许将@前缀用于不是关键字的标识符,但强烈建议您不要使用它作为样式。

一个用例是如果您想编写这样的函数:

private void print(string @string) => Console.WriteLine(@string);

通常,您将无法命名标识符string,因为它是保留关键字。 @前缀使您可以这样做。