Untuk kasus sederhana di mana itu adalah rangkaian tunggal sederhana, saya merasa itu tidak sebanding dengan kerumitannya string.Format(dan saya belum menguji, tetapi saya curiga untuk kasus sederhana seperti ini, string.Format mungkin sedikit lebih lambat, apa dengan format string parsing dan semua). Seperti Jon Skeet, saya lebih suka untuk tidak menelepon secara eksplisit .ToString(), karena itu akan dilakukan secara implisit oleh string.Concat(string, object)kelebihan beban, dan saya pikir kodenya terlihat lebih bersih dan lebih mudah dibaca tanpanya.
Tetapi untuk lebih dari beberapa rangkaian (berapa banyak yang subjektif), saya pasti lebih suka string.Format. Pada titik tertentu saya berpikir bahwa keterbacaan dan kinerja menderita yang tidak perlu dengan penggabungan.
Jika ada banyak parameter untuk format string (sekali lagi, "banyak" adalah subjektif), saya biasanya lebih suka menyertakan indeks yang diberi komentar pada argumen pengganti, jangan sampai saya kehilangan jejak nilai mana yang menuju ke parameter mana. Contoh yang dibuat-buat:
Console.WriteLine(
"Dear {0} {1},\n\n" +
"Our records indicate that your {2}, \"{3}\", is due for {4} {5} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary",
/*0*/client.Title,
/*1*/client.LastName,
/*2*/client.Pet.Animal,
/*3*/client.Pet.Name,
/*4*/client.Pet.Gender == Gender.Male ? "his" : "her",
/*5*/client.Pet.Schedule[0]
);
Memperbarui
Itu terjadi kepada saya bahwa contoh saya berikan adalah sedikit membingungkan, karena tampaknya bahwa saya telah digunakan baik Rangkaian dan string.Formatdi sini. Dan ya, secara logis dan leksikal, itulah yang telah saya lakukan. Tapi penggabungan semua akan dioptimalkan oleh kompiler 1 , karena semuanya adalah string literal. Jadi pada saat run-time, akan ada satu string. Jadi saya rasa saya harus mengatakan bahwa saya lebih suka menghindari banyak penggabungan pada waktu berjalan .
Tentu saja, sebagian besar topik ini sudah kedaluwarsa, kecuali Anda masih terjebak menggunakan C # 5 atau yang lebih lama. Sekarang kami memiliki string yang diinterpolasi , yang agar terbaca, jauh lebih unggul string.Format, di hampir semua kasus. Hari-hari ini, kecuali saya hanya menggabungkan nilai langsung ke awal atau akhir string literal, saya hampir selalu menggunakan interpolasi string. Hari ini, saya akan menulis contoh saya sebelumnya seperti ini:
Console.WriteLine(
$"Dear {client.Title} {client.LastName},\n\n" +
$"Our records indicate that your {client.Pet.Animal}, \"{client.Pet.Name}\", " +
$"is due for {(client.Pet.Gender == Gender.Male ? "his" : "her")} " +
$"{client.Pet.Schedule[0]} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary"
);
Anda kehilangan penggabungan waktu kompilasi dengan cara ini. Setiap string yang diinterpolasi diubah menjadi panggilan string.Formatoleh kompiler, dan hasilnya digabungkan pada waktu proses. Itu berarti ini adalah pengorbanan kinerja run-time untuk keterbacaan. Seringkali, ini adalah pengorbanan yang berharga, karena penalti run-time dapat diabaikan. Namun, dalam kode kinerja kritis, Anda mungkin perlu membuat profil solusi yang berbeda.
1
Anda dapat melihat ini di spesifikasi C # :
... konstruksi berikut diizinkan dalam ekspresi konstan:
...
- Operator biner + ... standar ...
Anda juga dapat memverifikasinya dengan sedikit kode:
const string s =
"This compiles successfully, " +
"and you can see that it will " +
"all be one string (named `s`) " +
"at run time";