Можно ли избежать двойных кавычек в буквальном строковом литерале?
В дословном строковом литерале (@"foo") в C# обратные косые черты не рассматриваются как escape-символы, поэтому выполнение \"для получения двойной кавычки не работает. Есть ли способ получить двойную кавычку в дословном строковом литерале?
Это понятно не работает:
string foo = @"this \"word\" is escaped";
7 ответов
Используйте двойную двойную кавычку.
@"this ""word"" is escaped";
выходы:
this "word" is escaped
Используйте двойные кавычки.
string foo = @"this ""word"" is escaped";
Для добавления дополнительной информации ваш пример будет работать без @
символ (это предотвращает выход с \), таким образом:
string foo = "this \"word\" is escaped!";
Он будет работать в обоих направлениях, но я предпочитаю стиль двойных кавычек, чтобы он был легче работать, например, с именами файлов (с большим количеством \ в строке).
В GitHub открыто предложение для языка C# о лучшей поддержке необработанных строковых литералов. Один из правильных ответов - побудить команду C# добавить в язык новую функцию (например, тройную кавычку - например, Python).
см. https://github.com/dotnet/csharplang/discussions/89#discussioncomment-257343
Как говорится в документах :
Простые escape-последовательности ... интерпретируются буквально. Только escape-последовательность кавычек (
""
) не интерпретируется буквально; он производит одну двойную кавычку. Кроме того, в случае дословно интерполированных управляющих последовательностей скобок ({{
и}}
) не интерпретируются буквально; они производят одинарные скобки.
Начиная с C#11, вы можете использовать необработанные строки , разделенные тремя двойными кавычками.
Они могут быть как однострочными, так и многострочными:
var singleLine = """Anything, including " is supported here without escaping""";
var multiLine = """
Any blank after the opening quotes in previous line is discarded.
This is WYSIWYG, including "quotes" and new lines.
This line is indented by 4 characters, not 8, because
the number of characters before the closing quotes
of the next line are removed from each line.
""";
В многострочной версии сохраняются новые строки и отступы, но, что интересно, символы перед отступом закрывающего """ отбрасываются, как объяснено выше. И, как и ожидалось, первая строка находится под открывающей, а последняя - та, перед закрывающими кавычками.
И вы также можете использовать@"""
для интерполяции, например
var @"""
The value of "{property}" is:
{value}
""";
ПРИМЕЧАНИЕ. В этом ответе я отформатировал код как Python, поскольку форматтер C# еще не знает об этом, а форматтер Python делает его более читабельным.