Строковая интерполяция - что делает знак @внутри фигурных скобок?

Рассматривать:

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?

Итак, когда мне нужен знак внутри внутри фигурных скобок?

Ответ 1

$"Hello { myValue }" - это интерполированная строка, которая была введена в С# 6. В вашем случае это эквивалентно вызову String.Format("Hello {0}", myValue).

Стенограмма (@) требуется, когда ваша переменная имеет то же имя, что и ключевое слово, которое, насколько мне известно, newline не является. Однако следующее приведет к ошибке компилятора:

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

в то время как это не будет:

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

Здесь verbatim сообщает компилятору, что if - это имя переменной, а не if -keyword.

Таким образом, вам не нужно дословно в вашем случае, потому что newline линия не является ключевым словом. Или, другими словами, ваш код эквивалентен этому:

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

который является допустимым (хотя и избыточным) использованием дословного.

Для получения дополнительной информации см. Документацию о строковой интерполяции.

Ответ 2

Это избыточный дословный префикс. Из спецификации С#:

Префикс "@" позволяет использовать ключевые слова как идентификаторы, что полезно при взаимодействии с другими языками программирования. Символ @на самом деле не является частью идентификатора, поэтому идентификатор можно увидеть на других языках в качестве обычного идентификатора без префикса. Идентификатор с префиксом @называется стенографическим идентификатором. Использование префикса @для идентификаторов, которые не являются ключевыми словами, разрешено, но сильно не рекомендуется в качестве стиля.

Вариант использования был бы, если бы вы хотели написать такую функцию:

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

Обычно вы не сможете назвать string идентификатора, потому что это зарезервированное ключевое слово. Префикс @ позволяет это сделать.