Как использовать 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.