Bagaimana Anda menggunakan string kata demi kata dengan interpolasi?

133

Di C # 6 ada fitur baru: string interpolasi.

Ini memungkinkan Anda menempatkan ekspresi langsung ke dalam kode, daripada mengandalkan indeks:

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

Menjadi:

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

Namun, kami memiliki banyak string di beberapa baris menggunakan string kata demi kata (terutama pernyataan SQL) seperti ini:

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

Mengembalikan ini ke string biasa tampak berantakan:

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

Bagaimana cara menggunakan string kata demi kata dan interpolasi bersama?

Keith
sumber
3
Jika ini benar-benar tentang string SQL, apakah ada alasan mengapa Anda tidak menggunakan query parametrized?
svick
1
"Kami memiliki banyak string di beberapa baris menggunakan string kata demi kata (terutama pernyataan SQL)" terdengar seperti Anda memiliki banyak string SQL yang memungkinkan serangan injeksi SQL.
Cetin Basoz
1
@vick kita, semua input pengguna parameter. Kami masih menggunakan SQL dinamis banyak, karena kami secara dinamis membuat SQL untuk entitas kami dalam kode.
Keith
1
@CetinBasoz kita tidak - semua input pengguna parameter. Ada banyak keadaan di mana Anda memiliki SQL dinamis - misalnya LINQ atau kerangka pemetaan objek lainnya.
Keith

Jawaban:

194

Anda bisa menerapkan keduanya $dan @awalan ke string yang sama:

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

Sejak diperkenalkan di C # 6 , string kata demi kata yang diinterpolasi harus dimulai dengan token $@, tetapi mulai dengan C # 8, Anda bisa menggunakan salah satu $@atau@$ .

Keith
sumber
57
Seberang ( @$"...") tidak berfungsi, yang membawaku ke sini.
Sinatr
12
@ Sinatr ya, harus $@"..."dalam urutan itu.
Keith
36
Fakta yang $@berfungsi saat @$tidak, masuk akal jika Anda memikirkannya. Ketika saya bingung tentang ini, yang sering terjadi ketika saya mulai menggunakan sintaks ini, saya selalu berkata pada diri saya sendiri: "Interpolasi string kata demi kata ini" menyebabkan yang sebaliknya tidak masuk akal.
Heki
1
@ RayLuo tidak benar-benar, tetapi mengingat seberapa cepat berbagai serialiser. NET JSON telah menjadi Anda mungkin tidak boleh langsung encoding JSON pula.
Keith
1
Jika menerapkan duo ke yang sudah ada const string, jatuhkan const.
bvj