ToString kullanım
Hayır, ToStringburada kullanmamalısın .
Dize birleştirmesi, dizeleri otomatik olarak dizelere dönüştürmez; bu, iki değişkeninizin neredeyse aynı olduğu anlamına gelir:
İşlenenlerden biri veya her ikisi de dize türünde olduğunda, önceden tanımlanmış toplama işleçleri işlenenlerin dize olarak temsil edilenlerini birleştirir.
Kaynak: C # Dil Özellikleri: Toplama operatörü, MSDN .
Öte yandan, birincisi (olmadan ToString):
- Yazmak daha kısa,
- Okumak daha kısa,
- Bakımı daha kolaydır ve:
- yazarın amacını tam olarak gösterir: dizeleri birleştirmek.
İlkini tercih edin.
Kaputun altında
İlginç olan, kaputun altında neler olduğunu görmek. Bunu görmenin yollarından biri, LINQPad içindeki IL kodunu izlemek. Bu program:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
aşağıdaki IL'ye çevrilir:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
Gördün System.String.Concatmü? Bu, orijinal kodun tam olarak aynı IL'ye dönüşen şekilde de yazılabileceği anlamına gelir:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
Belgelerinistring.Concat(object[]) okuduğunuzda şunları öğrenebilirsiniz:
Yöntem her bir nesne birleştirir args parametresiz çağırarak ToStringbu nesnenin bir yöntem; herhangi bir sınırlayıcı eklemez.
Bu ToStringgereksiz demektir . Ayrıca:
String.Empty dizideki boş nesnelerin yerine kullanılır.
Hangi bazı işlenenlerin null olduğu durumu güzelce ele alır (bkz. Dipnot 1).
Son örnekte, birleştirme tercüme edildiğinde string.Concat, derleyici optimizasyonlarını da vurgulamak gerekir:
var a = "Hello " + "World";
şu dile çevrilmiştir:
ldstr "Hello World"
stloc.0
Diğer yandan:
var a = string.Concat("Hello ", "World");
şu dile çevrilmiştir:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
Diğer alternatifler
Elbette C # 'da nesnelerin dize temsillerini birleştirmek için başka yollar vardır.
StringBuilderçok fazla birleştirme işlemi yapmanız gerektiğinde kullanılır ve oluşturulan ara dizelerin sayısını azaltmaya yardımcı olur. Bir StringBuilderveya sıradan bir birleştirme kullanmanız gerektiğine karar vermek kolay olmayabilir. Bir profil oluşturucu kullanın veya Yığın Taşması ile ilgili cevapları arayın.
Kullanmanın StringBuilder, kodun okunmasını ve bakımını zorlaştırmanın büyük bir dezavantajı vardır. Sorunuzdaki basit durumlar için, StringBuilderyalnızca kodun okunabilirliği için değil, aynı zamanda performans açısından da yararsızdır.
string.Join sınırlayıcı eklemeniz gerektiğinde kullanılmalıdır.
Açıkçası, string.Joindizeleri birleştirmek için asla boş bir ayırıcıyla kullanmayın .
string.Formatdize birleştirme işlemine dize şablonlaması tercih edildiğinde kullanılabilir. Tercih edebileceğiniz durumlardan biri, mesajın kunthet tarafından yanıtlandığı şekilde yerelleştirilebildiği durumlardır.
Kullanmanın string.Format, sizinki gibi basit durumlar için uygun olmayan birkaç dezavantajı vardır:
Basit "{0}" yer tutucuları ile, hangi parametrenin nereye gittiğine dair genellikle belirsizdir. Parametreleri yanlışlıkla tersine çevirmek veya unutmak sık görülür. Neyse ki, C # 6 nihayet bu sorunu çözen dize enterpolasyonunu tanıttı .
Çalışma zamanı performansı düşebilir. Tabii ki, düşünmeyin string.Formatolduğu zaman daha yavaş. Performans önemliyse, iki yaklaşımı ölçün ve varsayımlar yerine gerçek sonuçlarınıza göre hangisinin daha hızlı olduğunu belirleyin.
Kodun yazılması biraz daha uzun, okunması daha uzun ve bakımı daha zordur, ancak bu son derece küçüktür ve sizi çok fazla rahatsız etmemelidir.
¹ Fark, nesnelerden biri olduğunda görünür null. Olmadan ToString, a nullboş bir dize ile değiştirilir. İle ToStringa NullReferenceExceptionatılır.
a + "" + b + ""veya"" + a + b + "", hiç önemli değil: hepsi dize birleştirme var. İçindea + b + ""önemli:avebönce eklenir.