考虑:
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?
所以我什么时候需要花括号内的at符号?
$"Hello { myValue }"
是一个在C#6中引入的插值字符串。在你的情况下,这相当于调用String.Format("Hello {0}", myValue)
。
当你的变量与关键字同名时,需要逐字(@
),据我所知,newline
不是。但是,以下将导致编译器错误:
String.Format("Hello {0}", if)
虽然这不会:
String.Format("Hello {0}", @if)
这里逐字告诉编译器if
是变量的名称,而不是if
-keyword。
所以你不需要在你的情况下逐字,因为newline
不是一个关键字。或者换句话说,您的代码等同于:
Console.WriteLine("Hello with at{0}how are you?", @newline);
这是逐字的有效(尽管是多余的)使用。
有关更多信息,请参阅documentation about string-interpolation。
这是一个冗余的逐字前缀。来自C# specification:
前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许使用@前缀作为非关键字的标识符,但强烈建议不要使用样式。
一个用例就是你想写一个这样的函数:
private void print(string @string) => Console.WriteLine(@string);
通常,您将无法命名标识符string
,因为它是保留关键字。 @
前缀使您可以这样做。