字符串插值 - 花括号内的@符号有什么作用?

问题描述 投票:24回答:2

考虑:

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符号?

c# .net
2个回答
30
投票

$"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


15
投票

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

前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许使用@前缀作为非关键字的标识符,但强烈建议不要使用样式。

一个用例就是你想写一个这样的函数:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.