string.format dengan variabel vs variabel sebaris

9

Apa pro / kontra (jika ada) untuk digunakan

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

melawan

string output; 
int i = 10;
output = "the int is " + i;

Saya selalu menggunakan contoh terakhir, tetapi sepertinya sebagian besar tutorial online menggunakan contoh string.format. Saya tidak berpikir bahwa ada perbedaan nyata dalam hal efisiensi, pemikiran awal saya adalah seorang pembuat kode tidak harus terus memecahkan string untuk memasukkan variabel.

Jim
sumber
8
Alasan utamanya adalah membuat terjemahan menjadi lebih mudah, karena program Anda tidak perlu memahami cara bahasa yang berbeda membangun kalimat mereka. Sebagai contoh, banyak ungkapan dan frasa dalam bahasa Prancis adalah back-to-front dibandingkan dengan terjemahan bahasa Inggris mereka.
JohnL

Jawaban:

22

Jika Anda menganggap terjemahan penting dalam proyek Anda, sintaks pertama akan sangat membantu.

Misalnya, Anda mungkin memiliki:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

Perhatikan juga bahwa variabel Anda mungkin tidak selalu berada di tempat yang sama dalam kalimat dengan sintaks itu:

static final string output_yoda = "{1} years {0} has.";
Alex Garcia
sumber
4
+1 untuk menggunakan Yoda-speak sebagai contoh sintaks objek-subjek-kata kerja.
Mike Harris
1
Dengan C # kami memiliki opsi baru:System.out.println($"{name} is {age} year's old.");
Berin Loritsch
@BerinLoritsch: sayangnya benar-benar tidak dapat digunakan untuk pelokalan.
Bryan Boettcher
@BryanBoettcher, mengerti, tapi saya tidak melihat apa pun di OP yang mengatakan itulah yang ingin mereka capai.
Berin Loritsch
8

Lihatlah jawaban pertama untuk /programming/4671610/why-use-string-format . Ini mencakup semua yang menurut saya mengapa lebih baik.

Juga, masing-masing .NET assembly memiliki kumpulan intern, berisi koleksi string unik. Ketika kode Anda dikompilasi, semua string literal yang Anda referensi dalam kode Anda ditambahkan ke kumpulan ini. Jika Anda memiliki kode yang terlihat seperti ini:

"the int is " + i + " and the double is " + d

Itu membuatnya 2 string di kolam renang.

Jika Anda memiliki:

"the int is {0} and the double is {1}"

Anda hanya memiliki satu String di kolam renang.

Agak lebih rumit untuk mengetahui kapan Strings diinternir, dan ketika mereka bukan karena kompiler memiliki kecerdasan ketika mendeteksi Strings yang kadang-kadang tidak perlu diinternir ... Lihat misalnya artikel ini yang memberikan lebih banyak wawasan tentang ini masalah.

Sunting: setelah menggali sedikit, saya telah menemukan jawaban yang menarik untuk pertanyaan Kapan lebih baik menggunakan String.Format vs string concatenation? . Singkatnya, penulis jawaban dengan +30 suara membuat argumen menarik yang mendukung penggabungan String ketika lokalisasi tidak terlibat.

Jalayn
sumber
2
Saya pikir juga, secara gaya, itu beresonansi dengan orang-orang yaitu orang-orang seperti saya, yang digunakan untuk printf dan sprintf dari c.
Jonathan Henson
Saya ingin tahu mengapa downvote untuk memperbaiki jawaban saya. Terima kasih.
Jalayn
4

Saya lebih suka cara pertama karena memungkinkan saya untuk secara akurat melihat seperti apa bentuk string ketika output. Sangat mudah untuk lupa menambahkan spasi, atau menambahkan spasi tambahan saat hanya menambahkan string.

Saya yakin bahwa ada juga manfaat kinerja dengan cara pertama karena tidak harus membuat string ekstra; tapi itu bukan perhatian utama saya.

John Kraft
sumber
2

Dengan menggunakan opsi pertama Anda dapat menyimpan string format yang umum digunakan dan mengurangi pengetikan yang diperlukan dan membuatnya lebih mudah untuk memperbarui string di mana pun string itu digunakan. Pada dasarnya opsi pertama memungkinkan KERING untuk diimplementasikan dengan mudah. Ini juga merupakan sintaks yang jauh lebih baik jika beberapa variabel perlu digunakan dalam sebuah string, seperti yang Anda sebutkan.

Ryathal
sumber
ahh saya mengerti, saya kira saya tidak memikirkan contoh: string.format ("int adalah {0}. lagi itu adalah {0}", int);
Jim
1

Saya pikir dengan string.Format()itu lebih mudah untuk melihat apa sebenarnya hasilnya (sehingga Anda tidak memiliki masalah dengan ruang yang terlupakan atau sesuatu seperti itu), dan juga lebih mudah untuk mengetik dan memodifikasi.

Jika Anda ingin melakukan pemformatan yang sangat sederhana, menggunakan +operator plus mungkin lebih mudah, tetapi saya cenderung menggunakannya hanya saat menggabungkan dua string, tidak lebih.

Untuk menunjukkan bagaimana string.Format()lebih mudah untuk memodifikasi, pertimbangkan bahwa Anda ingin menambahkan penghentian penuh pada akhir kalimat dalam contoh Anda: beralih dari string.Format("The int is {0}", i)menjadi string.Format("The int is {0}.", i)hanya satu karakter. Tetapi pergi dari "the int is " + ike "the int is " + i + '.'jauh lebih banyak.

Keuntungan lain string.Format()adalah memungkinkan Anda untuk dengan mudah menentukan format yang akan digunakan, seperti string.Format("The int is 0x{0:X}.", i). Ini bahkan lebih penting ketika memformat tanggal.

Adapun efisiensi, string.Format()kemungkinan besar lebih lambat dari penggabungan string sederhana. Tetapi kode seperti ini kemungkinan besar tidak berada di jalur panas, jadi tidak masalah. Dan jika ya, Anda mungkin lebih baik menggunakan StringBuilder.

svick
sumber
string.Format secara internal menggunakan StringBuilder
Bryan Boettcher
1

Gunakan kode yang membuat kode Anda paling mudah dibaca. Jangan khawatir tentang kinerja.

Untuk contoh Anda di bawah ini saya lebih suka B karena hanya lebih mudah dibaca. Tetapi terjemahan bahasa di atas juga masuk akal. Jangan biarkan siapa pun memaksa Anda menggunakan string. Sebaliknya, baca dan arahkan ke blog Jeff Atwood yang luar biasa di Tragedi Sedih Teater Mikro Optimalisasi

SEBUAH:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

melawan

B:

string output; 
int i = 10;
output = "the int is " + i;
Makach
sumber
-1

Ref: String output: format atau concat dalam C #?

Pertimbangkan kode ini.

Ini adalah versi kode Anda yang sedikit dimodifikasi.

  1. Saya menghapus Console.WriteLine karena mungkin beberapa perintah lebih lambat dari yang saya coba ukur.
  2. Saya menatap Stopwatch sebelum loop dan menghentikannya tepat setelah ini, dengan cara ini saya tidak kehilangan presisi jika fungsi mengambil contoh 26,4 ticks untuk dieksekusi.
  3. Cara Anda membagi hasil dengan jumlah iterasi salah. Lihat apa yang terjadi jika Anda memiliki 1000 milidetik dan 100 milidetik. Dalam kedua situasi Anda akan mendapatkan 0 ms setelah membaginya dengan 1000000.
Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

Itulah hasil saya:

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 618ms - 2213706 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 166ms - 595610 ticks
kode jp2
sumber
1
Bagaimana ini menjawab aspek jika contoh kode pertama atau contoh kode kedua adalah desain yang lebih baik? Bagaimana setengah detik lebih dari 1 juta iterasi diperhitungkan jika ini adalah kode yang lebih mudah bagi seseorang untuk mempertahankan atau tidak?
Jim bertanya, "Apa pro dan kontra?" Ini menunjukkan bahwa pada banyak iterasi, String.Format lebih cepat.
jp2code
Anda harus mempertimbangkan untuk menambahkan sepenuhnya ke jawaban Anda daripada meninggalkannya sebagai blok kode dan perbedaan dari kode OP. Seperti berdiri, jawaban Anda tidak menjawab pertanyaan OP dalam bahasa Inggris. Lihatlah jawaban yang lain. Mungkin saja untuk menghapus semua kode dari mereka dan masih memiliki jawaban untuk pertanyaan OP.