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?


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@$ .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.