C # 6'da dize enterpolasyonu ile kaçış karakterleri nasıl kullanılır?


88

Dize enterpolasyonunu kullanıyorum ve onu seviyorum, ancak çıktıma ters eğik çizgi eklemeye çalıştığım bir sorunum var, ancak işe yarayamıyorum.

İstediğim şey bunun gibi bir şey ..

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

Combo'nun çıktısının olmasını istiyorum

myDomain\myUserName

Elime geçen şey, \ 'nin bir çıkış karakteri olmasıyla ilgili bir sözdizimi hatası \\ koyarsam snytax hatası gider, ancak çıktı myDomain \\ myUsername

Enterpolasyonlu bir dizeye kaçan karakterleri nasıl ekleyebilirim?


Teşekkürler. Ama sonra dize enterpolasyonunu kullanamıyorum? Her şeyden kaçmak istemiyorum. Enterpolasyonlu bir dizenin içinde bir ters eğik çizgi kullanmak istiyorum.
Matt

Hayır yapamazsın. Cevabı yanlış.
greenhoorn

3
bana bir hata gibi geliyor;) \\ işe
Matt

$ {Domain} \\ {userName} için doğru çıktıyı alıyorum .. Bu bir web uygulaması mı?
greenhoorn

2
Nhan'ın cevabı mükemmel çalışıyor gibi görünüyor. $@"{domain}\{userName}". Bence denemelisin ve kabul etmelisin. Tam olarak aynı sorunu yaşadım, alan adı ve kullanıcı adı da vardı ve yöntemi iyi çalışıyor.
ProfK

Yanıtlar:


107

Ters eğik çizgi ( \) ile çıkış, küme ayracı dışındaki tüm karakterler için çalışır.

Küme ayracından ( {veya }) kaçmaya çalışıyorsanız , https://msdn.microsoft.com/en-us/library/dn961160.aspx başına {{veya }}başına kullanmanız gerekir .

... Tüm çift kaşlı ayraçlar ("{{" ve "}}") tek bir küme parantezine dönüştürülür.


OP'nin açıkça açıkladığı gibi, ters eğik çizgi için çalışmaz.
ProfK

80

Bunu hem $ @ kullanarak yapabilirsiniz. Sıra önemlidir.

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

4
En iyi ve basit cevap. İnsanların neden daha karmaşık cevaplar seçtiğini anlamayın. Birebir
Alex34758

3
"C # 8.0 ile başlayarak, $ ve @ jetonlarını herhangi bir sırada kullanabilirsiniz" (Yukarıdaki yorumda Alex'in bağlantısından).
Casey Plummer

9

Eduardo haklı. Kıvrımlı parantezleri ikiye katlayarak kaçarsınız. Bu nedenle, etki alanı değişkenini {alan_adim} olarak çıktı almak isterseniz, yapmanız gereken:

$"{{{domain}}}";

Ayrıca, mevcut tarihin 1 Eylül 2016 olduğunu varsayarsak, bunu yapmak:

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

yerelleştirmenize bağlı olarak "Tarih 2016/09/01 3:04:48 PM" gibi bir çıktı verir. Tarihi şu şekilde de biçimlendirebilirsiniz:

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

"Tarih 1 Eylül 2016" sonucunu verir. Enterpolasyonlu dizeler çok daha okunabilir. Güzel cevap Eduardo.


1
OP küme parantezlerinden kaçmaya çalışmıyor. Ters eğik çizgiden kaçmaya çalıştıklarını ve normal `\\ '' nin enterpolasyonlu bir dizede çalışmadığını açıkça belirtirler.
ProfK

3
OP'nin ne sorduğu umrumda değil, kıvırcık parantezlerden kaçmak istedim ve ilk google girişi buydu. Yani OP başlığı google'ı yanlış yönlendiriyor ve bu nedenle bu geçerli bir cevap ve oylamayı hak ediyor.
AndrewBenjamin

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

İyi çalışıyor - kaçış her zamanki gibi çalışıyor (kaçış hariç {). En azından .NET 4.6 ve VS 14.0.22823 D14REL üzerinde.

Herhangi bir nedenle işe yaramazsa (belki derleyicinin eski bir sürümünü kullanıyorsunuz?), Daha açık bir şekilde de deneyebilirsiniz:

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

Ben de öyle düşündüm. ilginç, yüzey pro 3'ümde, kod normal \\ veya açık @ "\" ile düzgün çalışıyor, ancak iş makinemde çalışmıyor. bu yüzden kurulu sürümle ilgili olarak kafanızdaki çiviyi vurmuş olabileceğinizi düşünüyorum. İş makinem maalesef güncelleme olmadığını söylüyor. Öyleyse, size sorum şu: makinemde .net 4.6'nın tam sürümünü / yapısını nasıl belirleyebilirim? Bu konuda işler biraz değişmiş gibi görünüyor ve derleme / sürüm numaraları hakkında fazla rehberlik bulamıyorum.
Matt

Anladığım kadarıyla her iki makinede aynı .net ve 2015 RC sürümünü çalıştırıyorum. Düşünebildiğim tek fark, beklendiği gibi çalışan makinenin (SP3) Windows 10'un en son içeriden önizlemesini çalıştırmasıdır. Net framework'ün bununla birlikte geldiğine inanıyorum, bu yüzden belki bir şekilde daha yeni bir sürümüm var. Yine de özellikle nasıl kontrol edeceğimi bilmiyorum.
Matt

GÜNCELLEME clr.dll için özellik ayrıntılarında c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 klasörüne bakarak bir fark görebiliyorum. yüzeyimdeki sürüm 4.6.79.0 ve iş makinemdeki sürüm 4.6.57.0. Şimdi sorum şu, 4.6.57.0'dan 4.6.79.0'a nasıl yükseltebilirim? (bu neden bu kadar zor
Matt

@Matt Sanırım öyle değil - bende de 4.6.57.0 var ve gayet iyi çalışıyor. İşleri karıştıran bir Visual Studio eklentisine sahip olmanız mümkün mü?
Luaan

Herhangi bir güncelleme görmemenize rağmen davranışta bir farklılık gözlemlerseniz, belki de en son C # özelliklerini kullanan projelerde NuGet paketi "Microsoft.Net.Compilers" kullanımını düşünün. Bu, gözlemlenen davranış farklılıklarını çözebilir. Projelerimizde yaptı.
Manfred

3

Merhaba, enterpolasyonlu dizedeki ters eğik çizgiden kaçış kuralı ters eğik çizginin kopyasıdır:

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

konsol çıkışı

ancak enterpolasyonlu dizeyi aynen dize olarak da kullanırsanız, ters eğik çizgiden kaçmanız gerekmez:

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

ve aynısını alırsınız:

konsol çıkışı

Enterpolasyonlu dize hakkında bir eğitim için: bkz. Video enterpolasyonlu dizge


0

Eğer anlamadıysam. Çözüm gerçekten basit

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

Birdamongmen cevabını orada verilen iyi bir referansla da paylaşıyorum. Umarım size yardımcı olur. 5 sentim


1
Yanlış anladın. OP küme parantezlerinden kaçmaya çalışmıyor. Bir ters eğik çizgiden kaçmaya çalıştıklarını ve normal `\\ '' nin enterpolasyonlu bir dizede çalışmadığını açıkça
belirtiyorlar

-2

Bunu kullanabilirsiniz -

'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
Bu C # değil mi? (ama VB.NET?)
Julian

Bir vb .net programcısı sorusu için ac # cevabı aldığında bu aynı duygudur.
Vinod KC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.