Apakah ada cara mudah untuk membuat string multiline literal dalam C #?
Inilah yang saya miliki sekarang:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
Saya tahu PHP punya
<<<BLOCK
BLOCK;
Apakah C # memiliki sesuatu yang serupa?
42
sebagai parameter, terutama jika itu berasal dari input pengguna, untuk menghindari injeksi SQL.Jawaban:
Anda bisa menggunakan
@
simbol di depan astring
untuk membentuk string string kata demi kata :Anda juga tidak perlu melarikan diri karakter khusus ketika Anda menggunakan metode ini, kecuali untuk tanda kutip ganda seperti yang ditunjukkan dalam jawaban Jon Skeet.
sumber
@"my string".Replace(Environment.NewLine, "")
Ini disebut string kata demi kata literal dalam C #, dan itu hanya masalah menempatkan @ sebelum literal. Ini tidak hanya memungkinkan beberapa baris, tetapi juga mematikan melarikan diri. Jadi misalnya bisa Anda lakukan:
Ini termasuk jeda baris (menggunakan apa pun jeda baris sumber Anda memilikinya) ke dalam string, namun. Untuk SQL, itu tidak hanya tidak berbahaya, tetapi mungkin meningkatkan keterbacaan di mana pun Anda melihat string - tetapi di tempat lain mungkin tidak diperlukan, dalam hal ini Anda tidak perlu menggunakan string multi-baris kata demi kata untuk memulai, atau menghapusnya dari string yang dihasilkan.
Satu-satunya jalan keluar adalah jika Anda ingin penawaran ganda, Anda harus menambahkan simbol penawaran ganda tambahan:
sumber
Masalah dengan menggunakan string literal yang saya temukan adalah dapat membuat kode Anda terlihat sedikit " aneh " karena untuk tidak mendapatkan spasi dalam string itu sendiri, itu harus sepenuhnya dibariskan:
Yuck.
Jadi solusi yang saya suka gunakan, yang menjaga semuanya tetap selaras dengan sisa kode Anda adalah:
Dan tentu saja, jika Anda hanya ingin secara logis berpisah baris pernyataan SQL seperti Anda dan tidak benar-benar membutuhkan baris baru, Anda dapat selalu hanya pengganti
Environment.NewLine
untuk" "
.sumber
Satu gotcha lain yang harus diperhatikan adalah penggunaan string literal dalam string.Format. Dalam hal ini Anda perlu melepaskan kurung kurawal / kurung '{' dan '}'.
sumber
Sebagai catatan tambahan, dengan C # 6.0 Anda sekarang dapat menggabungkan string interpolasi dengan string literal kata demi kata:
sumber
$@"{{example literal text { fooString }. }}"
Ini mungkin membingungkan beberapa karena Angular, React, dan Vue.js menggunakan konvensi yang berlawanan.Mengapa orang membuat string yang membingungkan dengan string literal? Jawaban yang diterima adalah jawaban yang bagus untuk pertanyaan yang berbeda; tidak untuk yang satu ini.
Saya tahu ini adalah topik lama, tetapi saya datang ke sini dengan kemungkinan pertanyaan yang sama dengan OP, dan sangat frustasi melihat orang-orang terus salah membaca. Atau mungkin saya salah membaca, saya tidak tahu.
Secara kasar, string adalah wilayah memori komputer yang, selama eksekusi program, berisi urutan byte yang dapat dipetakan ke karakter teks. String literal, di sisi lain, adalah sepotong kode sumber, belum dikompilasi, yang mewakili nilai yang digunakan untuk menginisialisasi string nanti, selama eksekusi program di mana ia muncul.
Dalam C #, pernyataan ...
... tidak menghasilkan string tiga baris tetapi satu liner; gabungan tiga string (masing-masing diinisialisasi dari literal berbeda) tidak ada yang berisi pengubah baris baru.
Apa yang tampaknya ditanyakan OP - setidaknya apa yang akan saya tanyakan dengan kata-kata itu - bukanlah bagaimana memperkenalkan, dalam string yang dikompilasi, jeda baris yang meniru yang ditemukan dalam kode sumber, tetapi bagaimana memecah untuk kejelasan yang lama , satu baris teks dalam kode sumber tanpa memperkenalkan jeda dalam string yang dikompilasi. Dan tanpa memerlukan waktu eksekusi yang panjang, dihabiskan untuk bergabung dengan beberapa substring yang berasal dari kode sumber. Seperti garis miring terbalik dalam string multiline literal dalam javascript atau C ++.
Menyarankan penggunaan string kata demi kata, fungsi Nevermind
StringBuilder
,String.Join
s atau bahkan bersarang dengan pembalikan string dan apa yang tidak, membuat saya berpikir bahwa orang tidak benar-benar memahami pertanyaan. Atau mungkin saya tidak memahaminya.Sejauh yang saya tahu, C # tidak (setidaknya dalam versi paleolitik saya masih menggunakan, dari dekade sebelumnya) memiliki fitur untuk bersih hasil multiline string yang literal yang dapat diselesaikan selama kompilasi daripada eksekusi.
Mungkin versi saat ini mendukungnya, tapi saya pikir saya akan berbagi perbedaan yang saya rasakan antara string dan literal string.
MEMPERBARUI:
(Dari komentar MeowCat2012) Anda bisa. Pendekatan "+" oleh OP adalah yang terbaik. Menurut spek optimisasi dijamin: http://stackoverflow.com/a/288802/9399618
sumber
Saya belum melihat ini, jadi saya akan mempostingnya di sini (jika Anda tertarik untuk melewatkan string Anda dapat melakukan ini juga.) Idenya adalah bahwa Anda dapat memecah string pada beberapa baris dan menambahkan konten Anda sendiri (juga pada banyak baris) dengan cara apa pun yang Anda inginkan. Di sini "tableName" dapat diteruskan ke string.
sumber
createTable("MyTable");
Dalam kasus apa pun, pertanyaan OP adalah tentang bagaimana memasukkan string string multiline langsung dalam kode , bukan bagaimana membangun kueri basis data per se. :)Anda dapat menggunakan @ dan "" .
sumber
Ya, Anda dapat membagi string ke beberapa baris tanpa memasukkan baris baru ke string yang sebenarnya, tetapi tidak cantik:
Caranya adalah dengan memperkenalkan kode yang mengevaluasi kosong, dan kode itu mungkin berisi baris baru tanpa mempengaruhi output. Saya mengadaptasi pendekatan ini dari jawaban ini ke pertanyaan serupa.
Tampaknya ada beberapa kebingungan mengenai apa pertanyaannya, tetapi ada dua petunjuk bahwa yang kita inginkan di sini adalah string literal yang tidak mengandung karakter baris baru, yang definisinya mencakup beberapa baris. (di komentar dia bilang begitu, dan "ini yang saya punya" menunjukkan kode yang tidak membuat string dengan baris baru di dalamnya)
Tes unit ini menunjukkan maksud:
Ubah definisi kueri di atas sehingga menjadi satu string literal, alih-alih gabungan dua literal string yang mungkin atau mungkin tidak dioptimalkan menjadi satu oleh kompiler.
Pendekatan C ++ adalah untuk mengakhiri setiap baris dengan garis miring terbalik, menyebabkan karakter baris baru untuk melarikan diri dan tidak muncul dalam output. Sayangnya, masih ada masalah bahwa setiap baris setelah yang pertama harus dibariskan agar tidak menambahkan spasi tambahan ke hasilnya.
Hanya ada satu opsi yang tidak bergantung pada optimisasi kompiler yang mungkin tidak terjadi, yaitu menempatkan definisi Anda pada satu baris. Jika Anda ingin mengandalkan optimisasi kompiler, + yang sudah Anda miliki sangat bagus; Anda tidak perlu menyelaraskan kiri string, Anda tidak mendapatkan baris baru di hasilnya, dan itu hanya satu operasi, tidak ada panggilan fungsi, untuk mengharapkan optimasi aktif.
sumber
Tambahkan beberapa baris: gunakan @
Tambahkan Nilai String ke tengah: gunakan $
Beberapa string baris Tambahkan Nilai ke tengah: gunakan $ @
sumber
Jika Anda tidak ingin spasi / baris baru, penambahan string tampaknya berfungsi:
Anda dapat menjalankan di atas di sini jika mau.
sumber
Saya tahu saya agak terlambat ke pesta tetapi saya ingin merekomendasikan https://www.buildmystring.com/ untuk pembaca masa depan utas ini. Anda dapat mengonversi kode apa pun menjadi string C # literal menggunakan situs ini.
sumber
Anda dapat menggunakan dua metode ini:
Di SplitLineToMultiline (), Anda perlu menentukan string yang ingin Anda gunakan dan panjang baris, itu sangat sederhana. Terima kasih .
sumber