Bagaimana cara menggunakan karakter escape dengan interpolasi string di C # 6?

87

Saya telah menggunakan interpolasi string dan menyukainya, namun saya memiliki masalah di mana saya mencoba memasukkan garis miring terbalik dalam output saya, tetapi saya tidak dapat membuatnya berfungsi.

Yang saya inginkan adalah sesuatu seperti ini ..

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

Saya ingin hasil combo menjadi

myDomain\myUserName

Apa yang saya dapatkan adalah kesalahan sintaks tentang \ menjadi karakter pelarian. Jika saya memasukkan \\ maka kesalahan snytax hilang, tetapi hasilnya adalah myDomain \\ myUsername

Bagaimana cara menyertakan karakter yang lolos dalam string interpolasi?

Matt
sumber
Terima kasih. Tapi kemudian saya tidak bisa menggunakan interpolasi string? Saya tidak ingin melarikan diri dari segalanya. Saya hanya ingin menggunakan garis miring terbalik di dalam string yang diinterpolasi.
Matt
Tidak, kamu tidak bisa. Jawabannya salah.
greenhoorn
3
terasa seperti bug bagi saya;) \\ harus bekerja
Matt
Saya mendapatkan hasil yang benar untuk $ {domain} \\ {userName} .. Apakah ini aplikasi web?
greenhoorn
2
Jawaban Nhan sepertinya bekerja dengan sempurna. $@"{domain}\{userName}". Saya pikir Anda harus mencobanya, dan menerimanya. Saya memiliki masalah yang persis sama, hingga itu juga menjadi domain dan nama pengguna, dan metodenya berfungsi dengan baik.
ProfK

Jawaban:

107

Melarikan diri dengan garis miring terbalik ( \) berfungsi untuk semua karakter kecuali tanda kurung kurawal.

Jika Anda mencoba melepaskan kurung kurawal ( {atau }), Anda harus menggunakan {{atau }}sesuai dengan https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Semua tanda kurung kurawal ganda ("{{" dan "}}") diubah menjadi tanda kurung kurawal tunggal.

birdamongmen
sumber
Itu tidak bekerja untuk garis miring terbalik itu sendiri, seperti yang dijelaskan OP dengan jelas.
ProfK
80

Anda dapat melakukan ini, menggunakan $ @. Urutan itu penting.

var combo = $@"{domain}\{userName}";
Nhan
sumber
4
Jawaban terbaik dan sederhana. Tidak mengerti mengapa orang memilih jawaban yang lebih rumit. Tautan MSDN untuk string interpolasi verbatim docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
3
"Dimulai dengan C # 8.0, Anda dapat menggunakan token $ dan @ dalam urutan apa pun" (Dari tautan Alex di komentar di atas).
Casey Plummer
8

Eduardo benar. Anda melepaskan diri dari kawat gigi keriting dengan menggandakan. Oleh karena itu, jika Anda ingin mengeluarkan variabel domain sebagai {mydomain}, Anda perlu melakukan:

$"{{{domain}}}";

Selanjutnya, dengan asumsi tanggal saat ini adalah 1 Sept 2016, lakukan ini:

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

akan menghasilkan sesuatu seperti "The date is 2016/09/01 3:04:48 PM" tergantung pada pelokalan Anda. Anda juga dapat memformat tanggal dengan melakukan:

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

yang akan menampilkan "The date is September 1, 2016". String yang diinterpolasi jauh lebih mudah dibaca. Jawaban bagus Eduardo.

Dirk Strauss
sumber
1
OP tidak mencoba melepaskan diri dari kurung kurawal. Mereka dengan jelas menyatakan bahwa mereka mencoba melarikan diri dari garis miring terbalik itu sendiri, dan `\\` normal tidak berfungsi dalam string yang diinterpolasi.
ProfK
3
Saya tidak peduli apa yang diminta OP. Saya ingin melepaskan diri dari kurung kurawal dan entri Google pertama adalah ini. Jadi OP menuju menyesatkan google dan oleh karena itu ini adalah jawaban yang valid dan layak untuk di upvoting.
AndrewBenjamin
4
$"{domain}\\{user}"

Bekerja dengan baik - melarikan diri berfungsi seperti biasa (kecuali saat melarikan diri {). Setidaknya pada .NET 4.6 dan VS 14.0.22823 D14REL.

Jika tidak berhasil karena beberapa alasan (mungkin Anda menggunakan versi kompiler yang lebih lama?), Anda juga dapat mencoba lebih eksplisit:

$"{domain}{@"\"}{user}"
Luaan
sumber
Itu juga yang saya pikirkan. menarik, pada permukaan saya pro 3, kode bekerja dengan baik baik dengan \\ normal atau eksplisit @ "\", namun pada mesin kerja saya tidak. jadi saya pikir Anda mungkin telah tepat sasaran sehubungan dengan versi yang diinstal. Sayangnya, mesin kerja saya mengatakan tidak ada pembaruan yang tersedia. Jadi, pertanyaan saya kepada Anda adalah bagaimana cara menentukan versi / build yang tepat dari .net 4.6 di komputer saya? hal-hal tampaknya telah sedikit berubah dalam hal ini dan saya tidak dapat menemukan banyak panduan tentang nomor build / versi.
Matt
dari apa yang dapat saya katakan bahwa saya menjalankan versi yang sama dari .net dan vs 2015 RC pada kedua mesin. satu-satunya perbedaan yang dapat saya pikirkan adalah bahwa mesin yang berfungsi seperti yang diharapkan (SP3) menjalankan pratinjau orang dalam terbaru dari windows 10. Saya percaya .net framework dilengkapi dengan ini, jadi mungkin saya memiliki versi yang lebih baru di sana. Saya hanya tidak tahu cara memeriksanya secara spesifik.
Matt
UPDATE mencari di folder c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 di detail properti untuk clr.dll Saya dapat melihat perbedaannya. versi di permukaan saya adalah 4.6.79.0 dan versi di mesin kerja saya adalah 4.6.57.0. Jadi pertanyaan saya sekarang, bagaimana cara meningkatkan dari 4.6.57.0 ke 4.6.79.0? (mengapa ini sangat sulit!;)
Matt
@ Mat Saya tidak berpikir hanya itu - Saya juga memiliki 4.6.57.0 dan berfungsi dengan baik. Apakah mungkin Anda menginstal beberapa ekstensi Visual Studio yang mengacaukan segalanya?
Luaan
Jika Anda mengamati perbedaan dalam perilaku meskipun tidak melihat pembaruan apa pun, mungkin pertimbangkan penggunaan paket NuGet "Microsoft.Net.Compilers" dalam proyek yang menggunakan fitur C # terbaru. Ini dapat menyelesaikan perbedaan perilaku yang diamati. Itu terjadi di proyek kami.
Manfred
3

Hai aturan untuk melarikan diri dari garis miring belakang dalam string yang diinterpolasi adalah duplikat garis miring belakang:

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

keluaran konsol

tetapi jika Anda juga menggunakan string yang diinterpolasi sebagai string kata demi kata maka Anda tidak perlu keluar dari garis miring belakang:

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

dan Anda mendapatkan hal yang sama:

keluaran konsol

Untuk tutorial tentang string interpolasi: lihat video string interpolasi

pengembang bebas
sumber
0

Jika saya tidak salah paham. Solusinya sangat sederhana

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

Saya membagikan jawaban birdamongmen serta referensi bagus yang disediakan di sana. Semoga bermanfaat bagi Anda. 5 sen saya

Eduardo
sumber
1
Anda salah paham. OP tidak mencoba melepaskan diri dari kurung kurawal. Mereka dengan jelas menyatakan bahwa mereka mencoba melarikan diri dari garis miring terbalik itu sendiri, dan normal `\\` tidak berfungsi dalam string yang diinterpolasi
ProfK
-2

Anda dapat menggunakan ini -

'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
Vinod KC
sumber
1
Ini ada C #? (tapi VB.NET?)
Julian
Nah, ini adalah perasaan yang sama ketika seorang programmer vb .net mendapatkan jawaban ac # untuk pertanyaannya.
Vinod KC