Як використовувати символи екранування з інтерполяцією рядків у C # 6?


86

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

Я хочу щось подібне ..

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

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

myDomain\myUserName

Я отримую синтаксичну помилку про те, що \ є символом втечі. Якщо я вставлю \\, тоді помилка snytax зникне, але результат буде myDomain \\ myUsername

Як я можу включити екрановані символи в інтерпольований рядок?


Дякую. Але тоді я не можу використовувати інтерполяцію рядків? Я не хочу уникати всього. Я просто хочу використовувати зворотну скісну риску всередині інтерпольованого рядка.
Matt

Ні, ти не можеш. Його відповідь неправильна.
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}";

видасть щось на зразок "Дата 01.09.2016 15:04:48" залежно від вашої локалізації. Ви також можете відформатувати дату, виконавши:

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

який видав би "Дата 1 вересня 2016 року". Інтерпольовані рядки набагато читабельніші. Гарна відповідь Едуардо.


1
OP не намагається уникнути фігурних дужок. Вони чітко заявляють, що намагаються уникнути зворотної косої риски, і звичайне `\\` не працює в інтерпольованому рядку.
ProfK

3
Мені байдуже, про що запитував ОП, я хотів уникнути фігурних дужок, і перший запис у Google був такий. Отже, заголовок OP вводить Google в оману, і тому це вірна відповідь і заслуговує на голосування.
AndrewBenjamin

4
$"{domain}\\{user}"

Працює нормально - втеча працює як зазвичай (за винятком випадків, коли втікає {). Принаймні на .NET 4.6 та VS 14.0.22823 D14REL.

Якщо з якихось причин це не працює (можливо, ви використовуєте стару версію компілятора?), Ви можете спробувати бути більш явним:

$"{domain}{@"\"}{user}"

Це я теж думав. цікаво, на моїй поверхні pro 3 код працює нормально або зі звичайним \\, або з явним @ "\", однак на моїй робочій машині це не так. тож я думаю, ви могли вдарити цвяхом по голові щодо встановленої версії. На моїй робочій машині, на жаль, немає оновлень. Отже, моє запитання до вас - як мені визначити точну версію / збірку .net 4.6 на моїй машині? речі, здається, трохи змінилися в цьому відношенні, тому я не можу знайти значних вказівок щодо номерів збірки / версії.
Метт

з того, що я можу сказати, я використовую одну і ту ж версію .net та проти 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);

Я поділяю відповідь птахів серед людей, а також хороші посилання, надані там. Сподіваюся, це корисно для вас. Мої 5 центів


1
Ви не зрозуміли. OP не намагається уникнути фігурних дужок. Вони чітко заявляють, що намагаються уникнути зворотної косої риски, і звичайне `\\` не працює в інтерпольованому рядку
ProfK

-1

Ви можете використовувати це -

'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

Це не C #? (але VB.NET?)
Джуліан

Ну, це те саме відчуття, коли програміст vb .net отримує відповідь AC # на своє запитання.
Vinod KC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.