int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3
Haruskah saya menggunakan:
string expression = "Expression: " + a + " + " + b + " = " + sum;
atau
string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();
Apakah disarankan untuk digunakan ToString()
saat penggabungan string
dan int
?
a + "" + b + ""
atau"" + a + b + ""
, itu tidak masalah: itu semua penggabungan string. Dia + b + ""
dalamnya itu penting:a
danb
ditambahkan pertama."Expression: " + a
akan menampilkan kesalahan waktu kompilasi (dengan Opsi Strict On),"Expression: " & a
akan melakukan penggabungan string.Jawaban:
ToString
pemakaianTidak, Anda tidak boleh menggunakannya di
ToString
sini.Rangkaian string secara otomatis mengubah non-string menjadi string, yang berarti bahwa dua varian Anda hampir sama:
Sumber: C # Bahasa Spesifikasi: Operator tambahan, MSDN .
Di sisi lain, yang pertama (tanpa
ToString
):Jadi lebih suka yang pertama.
Dibawah tenda
Yang juga menarik adalah melihat apa yang terjadi di bawah tenda. Salah satu cara untuk melihatnya adalah dengan menonton kode IL dalam LINQPad. Program ini:
diterjemahkan ke IL berikut:
Lihat itu
System.String.Concat
? Itu berarti bahwa kode asli dapat ditulis juga seperti itu, yang diterjemahkan menjadi IL yang sama persis:Ketika Anda membaca dokumentasi
string.Concat(object[])
, Anda dapat belajar bahwa:Ini artinya
ToString
berlebihan. Juga:Yang menangani dengan baik kasus di mana beberapa operan adalah nol (lihat catatan kaki 1).
Sementara dalam contoh terakhir, concatenation diterjemahkan ke dalam
string.Concat
, orang juga harus menyoroti optimasi kompiler:diterjemahkan ke dalam:
Di samping itu:
diterjemahkan ke dalam:
Alternatif lain
Tentu saja ada cara lain untuk menggabungkan representasi string dari objek di C #.
StringBuilder
digunakan ketika Anda perlu melakukan banyak operasi penggabungan dan membantu mengurangi jumlah string perantara yang dibuat. Memutuskan apakah Anda harus menggunakanStringBuilder
atau gabungan biasa mungkin tidak mudah. Gunakan profiler atau cari jawaban yang relevan di Stack Overflow.Menggunakan
StringBuilder
memiliki kelemahan utama membuat kode sulit dibaca dan dipelihara. Untuk kasus sederhana seperti yang ada dalam pertanyaan Anda,StringBuilder
tidak hanya berbahaya bagi keterbacaan kode, tetapi juga tidak berguna dalam hal kinerja.string.Join
harus digunakan ketika Anda perlu menambahkan pembatas.Jelas, tidak pernah digunakan
string.Join
dengan pembatas kosong untuk menyatukan string.string.Format
dapat digunakan ketika string templating lebih disukai daripada string concatenation. Salah satu kasus di mana Anda lebih suka saat pesan dilokalisasi, seperti yang disarankan dalam jawaban oleh kunthet.Menggunakan
string.Format
memiliki beberapa kelemahan yang membuatnya tidak cocok untuk kasus sederhana seperti milik Anda:Dengan placeholder "{0}" sederhana, sering tidak jelas parameter mana yang digunakan. Sering kali membalik parameter secara keliru atau melupakannya. Untungnya, C # 6 akhirnya memperkenalkan interpolasi string yang menyelesaikan masalah ini.
Kinerja runtime dapat menurun. Tentu saja, jangan menganggap
string.Format
ini selalu lambat. Jika kinerja penting, ukur dua pendekatan dan tentukan mana yang lebih cepat berdasarkan hasil aktual Anda alih-alih asumsi.Kode ini sedikit lebih panjang untuk ditulis, lebih lama untuk dibaca dan lebih sulit untuk dipelihara, meskipun ini sangat kecil dan seharusnya tidak terlalu mengganggu Anda.
¹ Perbedaannya muncul ketika salah satu objek adalah
null
. TanpaToString
, anull
digantikan oleh string kosong. DenganToString
, sebuahNullReferenceException
dilemparkan.sumber
+
praktik dianggap buruk di sebagian besar bahasa. Dalam hal ini saya akan gunakanstring.Concat
, dalam banyak kasusstring.Format
lebih baik. Ini tentu bukan Pythonic untuk digunakan+
, dan karena PEP 3101%
tidak disarankan jugastr.format
.null
benar - benar "menanganinya dengan baik"? Yah, itu tidak seburuk "pada kesalahan melanjutkan selanjutnya" ...Concat(object[])
akan digunakan sebagai gantinyaConcat(string[])
. Jadi"string " + i
sebenarnya tidak identik dengan"string " + i.ToString()
ToString()
: kode OP dalam satu kasus,System.String.Concat
implementasi dalam kasus lain. Jadi, jawabannya tetap valid: jangan menulis kode yang tidak bermanfaat.Sebagai gantinya, Anda harus menggunakan string formatter. Lebih mudah untuk memformat nomor Anda menjadi representasi string atau pelokalan. misalnya:
Info lebih lanjut tentang MSDN .
Namun, formatter string kurang dapat dibaca (dan mungkin juga kinerja) daripada penggabungan string.
sumber
Jika Anda menggunakan
+
penggabungan, itu sendiri menggunakanString.Concat
metode. String itu sendiri tidak mengekspos operator +.sebagai contoh:
dikompilasi menjadi:
Jika Anda langsung menelepon
ToString
, itu akan menghindari tinju dan memanggilConcat(string, string)
kelebihan. KarenanyaToString
panggilan akan sedikit lebih efisien walaupun tidak cukup signifikan. Anda lebih baik pergi dengan contoh yang Anda rasa lebih mudah dibaca.sumber