Как использовать escape-символы с интерполяцией строк в C # 6?

86

Я использую интерполяцию строк и мне это нравится, однако у меня есть проблема, когда я пытаюсь включить обратную косую черту в свой вывод, но не могу заставить ее работать.

Я хочу что-то вроде этого ...

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"

Я хочу, чтобы результат комбо был

myDomain\myUserName

Я получаю синтаксическую ошибку о том, что \ является escape-символом. Если я введу \\, то ошибка snytax исчезнет, ​​но на выходе будет myDomain \\ myUsername

Как включить экранированные символы в интерполированную строку?

Мэтт
источник
Спасибо. Но тогда я не могу использовать интерполяцию строк? Я не хочу убегать от всего. Я просто хочу использовать обратную косую черту внутри интерполированной строки.
Мэтт
Нет, не можешь. Его ответ неверен.
greenhoorn
3
кажется мне багом;) \\ должно работать
Мэтт
Я получаю правильный вывод для $ {domain} \\ {userName} .. Это веб-приложение?
greenhoorn
2
Ответ Нхан, кажется, работает отлично. $@"{domain}\{userName}". Я думаю, тебе стоит попробовать и принять это. У меня была точно такая же проблема, вплоть до домена и имени пользователя, и его метод отлично работает.
ProfK

Ответы:

104

Экранирование обратной косой чертой ( \) работает для всех символов, кроме фигурной скобки.

Если вы пытаетесь избежать фигурной скобки ( {или }), вы должны использовать {{или }}на https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Все вхождения двойных фигурных скобок («{{« и «}}») преобразуются в одиночные фигурные скобки.

птица среди людей
источник
Это не работает для самой обратной косой черты, как ясно объясняет OP.
ProfK
79

Вы можете сделать это, используя как $ @. Порядок важен.

var combo = $@"{domain}\{userName}";
Нхан
источник
4
Лучший и простой ответ. Не понимаю, почему люди выбирают более сложные ответы. Ссылка MSDN для дословно интерполированных строк docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
2
«Начиная с C # 8.0, вы можете использовать токены $ и @ в любом порядке» (из ссылки Алекса в комментарии выше).
Кейси Пламмер
8

Эдуардо прав. Вы избегаете фигурных скобок, удваиваясь. Следовательно, если вы хотите вывести переменную домена как {mydomain}, вам нужно будет сделать:

$"{{{domain}}}";

Кроме того, предполагая, что текущая дата - 1 сентября 2016 г., сделаем следующее:

$"The date is {DateTime.Now}";

выведет что-то вроде «Дата 2016/09/01 15:04:48 PM» в зависимости от вашей локализации. Вы также можете отформатировать дату, выполнив:

$"The date is {DateTime.Now : MMMM dd, yyyy}";

который выведет "Дата 1 сентября 2016 г.". Интерполированные строки более читабельны. Хороший ответ Эдуардо.

Дирк Штраус
источник
1
OP не пытается избежать фигурных скобок. Они четко заявляют, что пытаются избежать самой обратной косой черты, а обычный `\\` не работает в интерполированной строке.
ProfK
3
Меня не волнует, о чем спрашивал OP. Я хотел избежать фигурных скобок, и первая запись в Google была такой. Таким образом, заголовок OP вводит в заблуждение Google, и поэтому это действительный ответ, который заслуживает поддержки.
AndrewBenjamin
4
$"{domain}\\{user}"

Работает нормально - экранирование работает как обычно (кроме экранирования {). По крайней мере, на .NET 4.6 и VS 14.0.22823 D14REL.

Если по какой-то причине это не сработает (возможно, вы используете старую версию компилятора?), Вы также можете попытаться быть более точным:

$"{domain}{@"\"}{user}"
Луаан
источник
Я тоже так думал. интересно, на моем Surface Pro 3 код отлично работает как с обычным \\, так и с явным @ "\", однако на моей рабочей машине это не так. поэтому я думаю, что вы, возможно, попали в точку в отношении установленной версии. К сожалению, моя рабочая машина сообщает, что обновлений нет. Итак, мой вопрос к вам: как мне определить точную версию / сборку .net 4.6 на моем компьютере? Кажется, в этом отношении все немного изменилось, и я не могу найти много рекомендаций по номерам сборки / версии.
Мэтт
насколько я могу судить, я использую одну и ту же версию .net и vs 2015 RC на обеих машинах. единственное различие, о котором я могу думать, состоит в том, что машина, которая работает должным образом (SP3), запускает последнюю версию предварительной версии Windows 10. Я считаю, что .net framework поставляется с этим, так что, возможно, у меня есть более новая версия. Я просто не знаю, как конкретно это проверить.
Мэтт
ОБНОВЛЕНИЕ просматривая папку c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 в сведениях о свойствах clr.dll, я вижу разницу. версия на моей поверхности - 4.6.79.0, а версия на моей рабочей машине - 4.6.57.0. Итак, мой вопрос: как мне перейти с 4.6.57.0 на 4.6.79.0? (почему это ооочень сложно!;)
Мэтт
@Matt Не думаю, что это так - у меня тоже 4.6.57.0 и работает нормально. Возможно ли, что у вас установлено какое-то расширение Visual Studio, которое все портит?
Луаан,
Если вы наблюдаете разницу в поведении, несмотря на отсутствие обновлений, возможно, рассмотрите возможность использования пакета NuGet «Microsoft.Net.Compilers» в проектах, использующих новейшие функции C #. Это может устранить наблюдаемые различия в поведении. Так было в наших проектах.
Манфред
3

Привет, правило для экранирования обратной косой черты в интерполированной строке дублирует обратную косую черту:

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\\{userName}";

консольный вывод

но если вы также используете интерполированную строку как дословную строку, вам не нужно избегать обратной косой черты:

var domain = "mydomain";
var userName = "myUserName";
var combo = $@"{domain}\{userName}";

и вы получите то же самое:

консольный вывод

Учебник по интерполированной строке: см. Видео интерполированная строка

свободный разработчик
источник
0

Если я не неправильно понял. Решение очень простое

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{{{domain}}}\\{{{userName}}}";
Console.WriteLine(combo);

Я разделяю ответ birdamongmen, а также хорошую ссылку, предоставленную там. Надеюсь, это будет вам полезно. Мои 5 центов

Эдуардо
источник
1
Вы неправильно поняли. OP не пытается избежать фигурных скобок. Они четко заявляют, что пытаются избежать самой обратной косой черты, и нормальный `\\` не работает в интерполированной строке
ProfK
-2

Вы можете использовать это -

'First, declare the curley braces as chars
        Dim LeftBrace As Char = "{"
        Dim RightBrace As Char = "}"

        'Then in your string, use like this-
        Dim myStr As String = $"This is a {LeftBrace}String{RightBrace}"

        'Now, the output will be
        ' This is a {string}code here
Винод КС
источник
1
Это не C #? (но VB.NET?)
Юлиан
Что ж, это то же самое чувство, когда программист vb .net получает ответ на свой вопрос на языке C #.
Vinod KC