Enterpolasyonlu kelimesi kelimesine dizeleri nasıl kullanıyorsunuz?


133

C # 6'da yeni bir özellik vardır: enterpolasyonlu dizeler.

Bunlar, ifadeleri dizinlere güvenmek yerine doğrudan koda koymanıza izin verir:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

Oluyor:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

Bununla birlikte, aşağıdaki gibi harfi harfine dizeleri (çoğunlukla SQL ifadeleri) kullanan birden çok satırda çok sayıda dizgimiz var:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

Bunları normal dizelere döndürmek karmaşık görünüyor:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

Hem harfi harfine hem de enterpolasyonlu dizeleri birlikte nasıl kullanırım?


3
Gerçekten SQL dizeleriyle ilgiliyse, bunun yerine parametreleştirilmiş sorgular kullanmamanızın herhangi bir nedeni var mı?
svick

1
"Aynı dizeleri (çoğunlukla SQL deyimleri) kullanan birden çok satırda çok sayıda dizgimiz var" kulağa, SQL enjeksiyon saldırılarına olanak tanıyan çok sayıda SQL dizesi varmış gibi geliyor.
Çetin Başöz

1
@svick biz, kullanıcı girdisi her şey parametreleştirilmiştir. Koddaki varlıklarımız için dinamik olarak SQL oluşturduğumuzdan, yine de yoğun bir şekilde dinamik SQL kullanıyoruz.
Keith

1
@CetinBasoz biz yapmayız - tüm kullanıcı girdileri parametreleştirilmiştir. Dinamik SQL'iniz olduğu pek çok durum vardır - örneğin LINQ veya diğer herhangi bir nesne eşleme çerçevesi.
Keith

Yanıtlar:


195

Her iki başvurabilir $ve @aynı dizeye önekleri:

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

C # 6'da tanıtıldığından beri , enterpolasyonlu kelimesi kelimesine dizelerin jetonlarla başlaması gerekiyordu$@ , ancak C # 8'den başlayarak, ya $@da@$ .


57
Opposite ( @$"...") çalışmıyor, bu da beni buraya getiriyor.
Sinatr

12
@Sinatr evet, bu $@"..."sırayla olmalı .
Keith

36
Çalışmadığında $@işe yaraması gerçeği, @$düşündüğünüzde çok mantıklı. Bu sözdizimini kullanmaya başladığımda sık sık yaşanan bu konuda kafam karıştığında, her zaman kendi kendime dedim: "Bu kelimesi dizgiyi ara" çünkü tersi bir anlam ifade etmiyor.
Heki

1
@RayLuo gerçekten değil, ancak çeşitli .NET JSON serileştiricilerin ne kadar hızlı hale geldiği göz önüne alındığında, muhtemelen JSON'u doğrudan kodlamamanız gerekir.
Keith

1
Varolan ikilisinin uygulayarak ise const string, bırakın const.
bvj
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.