考虑:
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?
那么什么时候需要花括号中的 符号?
答案 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
,因为它是保留关键字。 @
前缀使您可以这样做。