Можно ли избежать двойных кавычек в буквальном строковом литерале?

В дословном строковом литерале (@"foo") в C# обратные косые черты не рассматриваются как escape-символы, поэтому выполнение \"для получения двойной кавычки не работает. Есть ли способ получить двойную кавычку в дословном строковом литерале?

Это понятно не работает:

string foo = @"this \"word\" is escaped";

7 ответов

Решение

Используйте двойную двойную кавычку.

@"this ""word"" is escaped";

выходы:

this "word" is escaped

Используйте двойные кавычки.

string foo = @"this ""word"" is escaped";

Это должно помочь прояснить любые ваши вопросы: C# literals

Вот таблица из связанного контента:

Для добавления дополнительной информации ваш пример будет работать без @ символ (это предотвращает выход с \), таким образом:

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 делает его более читабельным.

Другие вопросы по тегам