Makale Özeti

Bu makalede metin birleştirme işlemlerinde kullanılan StringBuilder sınıfını inceleyeceğiz. Makalenin sonunda bu sınıfın performans olarak bize kazndırdıklarını küçük bir örnek üzerinde göreceğiz.

Makale

Bu makalede StringBuilder sınıfını inceleyeceğiz ayrıca makalenin sonunda küçük bir demo yaparak StringBuilder sınıfının etkinliğini gözler önüne sereceğiz. StringBuilder temel olarak metinsel ifadeleri birleştirmek için kullanılmaktadır. String sınıfıyla yapılan metin birleştirme işlemleri benzer şekilde StringBuilder ile de yapılabilmekte ve StringBuilder'ın bu noktada String sınıfına göre ciddi bir performans üstünlüğü bulunmaktadır. 

StringBuilder System.Text isim uzayı altında yer alan ve metin birleştirme işlemlerinde kullanılan bir sınıftır. Temel olarak string değişkeninin sahip olduğu bazı metot ve özelliklere sahiptir. Bunun yanında özel olarak Append, AppendFormat, AppendLine adlarında üç metodu daha vardır.

Temel bir StringBuilder tanımı aşağıdaki gibi yapılmaktadır. Bunun yanı sıra StringBuilder sınıfının 6 aşırı yüklenmiş constructor’ı vardır.

StringBuilder sbldr = new StringBuilder();

Eğer tanımlanan StringBuilder değişkenine başlangıçta bir değer vermek istersek tanımlamayı aşağıdaki gibi yapabiliriz.



StringBuilder sbldr = new StringBuilder("Fatih Coşkun", 5000); 
//Fatih Coşkun ile başlayan ve 5000 karakter uzunluğunda bir tanımlama 

Append Metodu

Append kelime anlamıyla eklemek anlamına gelmektedir. Yani adından da anlaşılacağı gibi tanımlanan StringBuilder’e yeni değerler (herhangi bir tip değişimine gerek kalmaksızın 19 tip değişken direkt olarak eklenebiliyor) ekleme işlemini yapar.
     
sbldr.Append(“Eklenecek Metin”);
              
AppendLine Metodu 

Appendline metodu ise eklenen verinin sonuna bir alt satıra geçmeye yarayan kodu yada diğer bir deyişle normal stringlerdeki alt satıra geçmeye yarayan \n işlemini yapar.
 
sbldr.AppendLine("deneme");
sbldr.AppendLine("deneme");
sbldr.AppendLine("deneme");

yazıp derlediğimizde ve ekrana mesaj kutusu ile yazdırdığımızda aşağıdaki gibi bir çıktıyla karşılaşırız. StringBuilder nesnesinin ToString metodu içerisindeki metinleri string tipine çevirir.

MessageBox.Show(sbldr.ToString());



StringBuilder'da yer alan bilgileri bir mesaj kutusuna yazdırdık

AppendFormat 

AppendFormat ise karmaşık metinsel verileri basit bir şekilde formatlayarak nesnemize eklememizi sağlar. Konsol uygulamalarındaki Console.Writeline metodunda gerçekleştirdiğimiz kullanımın bir benzerini bu metotla gerçekleştirebiliriz. "x değişkeni: {0} ve y değişkeni: {1}", x, y gibi bir kullanımda tırnak içerisinde {0} ile belirtilen yere virgül karakterinden sonra gelen ilk değişken, {1} yerine ise ikinci değişken gelecektir. Aslında AppendFormat tıpkı Console.WriteLine metodu gibi arka planda String.Format metodunu çağırarak böyle bir işlemin yapılmasını sağlar.

Temel kullanımı aşağıdaki gibidir.


Kullanımını küçük bir demo ile göstermek istersek aşağıdaki kodu derleyip çalıştırdığımız da

StringBuilder sbldr = new StringBuilder();
int i = 5;
string k = "Degisken2";

sbldr.AppendFormat("Değişken1:{0},\nDeğişkenİki={1}", i, k);
sbldr.AppendFormat("\n{0:c}", i);       //Sonuna ,00 ve para birimi ekledi.
sbldr.AppendFormat("\n{0:p}\n", i);     //başına % işareti ekledi.
MessageBox.Show(sbldr.ToString());  //String’e çevirip messagebox’a gönderdi


Sonucu aşağıdaki gibi görebiliriz.



Göründüğü gibi String.Format sınıfındaki üyeler aynı şekilde kullanılabiliyor.

Bu fonksiyonların yanında Replace ile istediğimiz karakteri yine istediğimiz başka bir karakter ile değiştirebiliriz.Örnek vermek gerekirse:

sb.Replace('f', 'F');     // Stringteki bütün Küçük f harflerini Büyük F’ye çevirir.

Yine Insert Metoduyla istediğimiz karakterden itibaren istediğimiz değişkeni(19 farklı) string’e ekleyebiliriz.Bunuda örneklendirmek gerekirse:

sbldr.Insert(12, "Fatih");     //12. Karakterden sonra “Fatih” kelimesini string’e ekler 


StringBuilder Etkinliği 


Şimdi StringBuilder sınıfının etkinliği ile ilgili olarak küçük çaplı bir proje geliştirelim. Visual Studio ile yeni bir web projesi açalım ve sayfanın yüklenmesi sırasında gelişen olayları ve durumları görmek için sayfanın Source kısmına geçip Aşağıdaki kodda olduğu gibi Trace =”True” kodunu ekleyelim.

<%@ page autoeventwireup="true" codefile="Default.aspx.cs" inherits="_Default" language="C#" trace="true" %>

Bu ifade sayfanın trace edilmesini(izlenmesini) ve sayfa çalıştığında sayfa gelişim sürecini, sayfanın her olayı için ne kadar süre harcandığını gösterir. Daha sonra sayfanın Page_Load olayına aşağıdaki kodlar yazılıp sayfa derlendiğinde aşağıdaki sonuç ortaya çıkmaktadır.

StringBuilder sbldr = new StringBuilder();
string str;
protected void Page_Load(object sender, EventArgs e)
{
          Trace.Warn("SbAppendOlayıBasladı");      
//Aşağıdaki pencerede kırmızı ile gösterilenleri ekrana basar.
           for (int i = 0; i < 100000; i++)
           {
                sbldr.Append(i.ToString());
           }
           Trace.Warn("SbAppendOlayıBitti");
           Trace.Warn("NormalEklemeOlayıBasladı");
           for (int i = 0; i < 100000; i++)
           {
               str += i.ToString ();
            }
            Trace.Warn("NormalEklemeOlayıBitti");
}



Ekranda görüldüğü gibi string ve StringBuilder sınıfı ile yapılan birleştirme işlemlerinde StringBuilder nesnesinin çok daha hızlı çalıştığı görülmektedir. Aynı işlem için StringBuilder’ın harcadığı efor string değişkeniyle yapılan normal işlem için yaklaşık olarak 1/250'i kadardır. Bu da string birleştirme işlemlerinde StringBuilder kullanmanın yeterli bir sebep olduğunu ortaya koyuyor. Buradan şöyle bir sonuç çıkarabiliriz: Eğer projemizde çok yoğun olarak metin birleştirme işlemleri yapıyorsak + karakteri ile string birleştirme işlemi yerine ("merhaba" + "dünya" gibi) StringBuilder'ın Append metodunu kullanmak işlemlerimizi çok daha hızlanıracaktır. Çünkü string değişkeni birleştirme işlemlerinde bellekte her eklenen değer için yer açmakta ve bu da yapılan işlemi yavaşlatmaktadır. Başka bir makalede görüşmek dileğiyle…

Fatih Coşkun