Basit bir tek birleştirme olduğu basit bir durum için, karmaşıklığına değmeyeceğini hissediyorum string.Format
(ve test etmedim, ancak bunun gibi basit bir durum için biraz daha yavaş string.Format
olabileceğinden şüpheleniyorum , biçim dizesi ayrıştırmasıyla ve tüm). Jon Skeet gibi ben de açık bir şekilde aramamayı tercih ediyorum .ToString()
, çünkü bu dolaylı olarak string.Concat(string, object)
aşırı yükleme ile yapılacaktır ve bence kod daha temiz görünüyor ve onsuz okunması daha kolay.
Ama birkaç bitiştirmeden daha fazlası için (kaçı özneldir) kesinlikle tercih ederim string.Format
. Bir noktada, hem okunabilirliğin hem de performansın birleştirme ile gereksiz yere zarar gördüğünü düşünüyorum.
Biçim dizesi için çok sayıda parametre varsa (yine, "birçok" özneldir), genellikle hangi değerin hangi parametreye gittiğinin izini kaybetmemek için, değiştirilen bağımsız değişkenlere açıklamalı dizinleri eklemeyi tercih ederim. Yapmacık bir örnek:
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]
);
Güncelleme
Bana, verdiğim örnek biraz kafa karıştırıcı geliyor, çünkü hem birleştirme hem destring.Format
burada kullandım. Ve evet, mantıksal ve sözcüksel olarak, yaptığım şey bu. Ancak birleştirmelerin tümü , hepsi dizgi değişmezleri olduğundan , derleyici 1 tarafından optimize edilecektir . Yani çalışma zamanında tek bir dize olacaktır. Bu yüzden sanırım çalışma zamanında birçok birleştirmeden kaçınmayı tercih ettiğimi söylemeliyim .
Elbette, C # 5 veya daha eski sürümleri kullanmaya devam etmediğiniz sürece bu konunun çoğu güncel değil. Şimdi , okunabilirlik açısından neredeyse tüm durumlarda çok daha üstün olan dizeleri enterpolasyonlu hale getirdik string.Format
. Bu günlerde, bir değeri doğrudan bir dizgenin başına veya sonuna birleştirmediğim sürece, neredeyse her zaman dize enterpolasyonu kullanıyorum. Bugün, daha önceki örneğimi şöyle yazacağım:
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"
);
Bu şekilde derleme zamanı birleştirmeyi kaybedersiniz. Enterpolasyonlu her dize string.Format
, derleyici tarafından bir çağrıya dönüştürülür ve sonuçları çalışma zamanında birleştirilir. Bu, okunabilirlik için çalışma zamanı performansından ödün verildiği anlamına gelir. Çoğu zaman, bu değerli bir fedakarlıktır, çünkü çalışma süresi cezası ihmal edilebilir düzeydedir. Bununla birlikte, performans açısından kritik kodda, farklı çözümlerin profilini çıkarmanız gerekebilir.
1
Bunu C # spesifikasyonunda görebilirsiniz :
... aşağıdaki yapılara sabit ifadelerde izin verilir:
...
- Önceden tanımlanmış + ... ikili operatör ...
Ayrıca küçük bir kodla da doğrulayabilirsiniz:
const string s =
"This compiles successfully, " +
"and you can see that it will " +
"all be one string (named `s`) " +
"at run time";