8/27/2005

String mi yoksa StringBuilder mi Kullanmali?

Özellikle SQL querylerini yazarken StringBuilder kullanımına alıştıktan sonra StringBuilder'ı her yerde kullanmaya başlamıştım. Şimdi çalıştığım yerde çoğu insanın string kullandığını görünce kafamda soru işaretleri oluştu ve StringBuilder ve string kullanımının farkına bi baktım. Sizlerle de paylaşayım...

Stringler değişken değiller. Bir kez tanımlandıktan sonra tekrar değiştirilemiyorlar. Bu yüzden siz yarattığınız bir string'e aşsağıdaki şekilde olduğiu gibi başka bir string eklemek istediğinizde, yeni bir string yaratılarak eklemek istediğiniz string orjinal string'in üzerine ekleniyor. İlk yarattığınız string ise .Net Framework vasıtasıyla garbage collection'a ugrayarak yok ediliyor.

VB.Net
Dim sMesaj as String = "Bu kitabi"
sMesaj &= sKullaniciAdi
sMesaj &= " satin aldi. "

C#
string sMesaj = "Bu kitabi" ;
sMesaj += sKullaniciAdi ;
sMesaj += " satin aldi " ;

String birleştirme işlemi .Net üzerinde optimize edilmiş bu yüzden ufak miktardakı(önerilen limiti belirteceğim) birleştirme işlemleri performansı olumsuz yönde etkilemiyor. .Net aplikasyonlarınızda string birleştirme işleminin performansa yan etkileri esas olarak çok fazla string birleştirme işlemini gerçekleştirmek istediğinizde ortaya çıkıyor.

Yukarıdaki örnekler için performans'a çok önemli bir olumsuz etki yok. Ancak string birleştirme işlemi için önerilan limit 5. Daha fazlasına ihtiyacınız var ise StringBuilder class'ını kullanmanız uygun.

Aynı şekilde yukarıdaki kodu aşsağıda belirtilen şekilde tek bir ifadede yazmış olsaydınız string birleştirme işlemi bir seferde yapılmış olacaktı ve performansa herhangi bir negatif etkisi olmayacaktı;

VB.Net
Dim sMesaj as String = "Bu kitabi" & sKullaniciAdi & " satin aldi. "

C#
string sMesaj = "Bu kitabi" + sKullaniciAdi + " satin aldi. " ;

Ancak her zaman yukarıdaki gibi string birlestirme yapmak kod okunurluğu açısından pek pratik sonuçlar vermeyebiliyor.

String birleştirme işlemleri için eğer 5 ve üzeri sayıdaki string'i birleştirmemiz söz konusu ise .Net aplikasyonlarımızda StringBuilder class'ını kullanmamız performans açısından daha avantajlı. Nedeni ise StringBuilder class'ının string benzeri, üzerinde değişiklik yapılabilen objeler yaratması. String'iniz üzerinde gerekli bütün değişiklikleri yaptıktan sonra StringBuilder objenizin değerini belirteceğiniz string değerine dönüştürebilirsiniz. Aşşağıda StringBuilder class'ını nasıl kullanabileceğinizi gösterdim;

VB.Net
Imports System.Text
Dim sbMesaj As StringBuilder
sbMesaj = New StringBuilder("Bu kitabi ")
sbMesaj.Append(sKullaniciAdi)
sbMesaj.Append(" satin aldi.")
Dim sMesaj As String = sbMesaj.ToString

C#
using System.Text
StringBuilder sbMesaj = new StringBuilder("Bu kitabi ");
sbMesaj.Append(sKullaniciAdi);
sbMesaj.Append(" satin aldi.");
string sMesaj = sbMesaj.ToString();

Kodunuzda bir çok string birleştirme işlemi gerekli gibi gözüküyorsa daha iyi bir performans için StringBuilder class'ını kullanmayı tercih edin.