Lisede yazılım geliştirmeye pascal ile başladığım dönemleri hatırlarım ara sıra.O yıllarda, ilk olarak bana kazandırılan, algoritma kurabilme yetisiydi.Yaklaşık olarak 12 sene olmasına rağmen derslerden birinde çözdüğümüz bir problemi dün gibi hatırlarım.Basit bir matematik problemi, karşılıklı olarak A ve B şehirlerinden aynı yönde iki araç hareket ediyor,araçların hızları ve aradaki mesafe bilgisi klavyeden programa input olarak veriliyordu.Program da çıktı olarak iki aracın ne kadar süre sonra karşılaşacakları bilgisini ekrana yazdırıyordu.O derste önemli olan sadece doğru sonucu veren programı yazmak ve + notu hocadan almaktı :) O zamanlar ismini bile duymadığım performans kelimesinin, yazılım geliştirmenin en önemli unsurlarında biri olduğunu yıllar sonra öğrendim.Bu yazıda da, performans konusunda farklılıklar içeren String ve StringBuilder sınıfları hakkında bilgi vermeye çalışacağım.

String ve StringBuilder sınıfları,metinsel ifadeler için kullanılan sınıflardır.
 
string yaziKonusu = “String ve StringBuilder arasındaki farklar”
 
Peki herhangi bir metinsel ifadeyi string değişkeninde saklayabiliyorken,neden StringBuilder sınıfını kullanmalıyız ?
 
Stringler değişmez (immutable) objelerdir.Öyle ki,tanımladığınız bir string’in içeriğini değiştirdiğinizde, o objenin içeriği değişmez.Her ne kadar değişiyor gibi gözükse de,arka planda bellek üzerinde bir kopyası daha oluşturulur.Bu da string’e her değer atamanızda yeni bir instance oluşması anlamına gelmektedir.Örneğin uygulamanız içinde bir log dosyası oluşturup,uygulamanın çalışması süresince her adımı log dosyasına yazacağınızı düşünün.Tanımladığınız string’in içeriğini sürekli değiştirerek log dosyasını yazmanız gerekiyor.Böyle bir durumda string kullanmak performans açısından kötü bir seçim olacaktır.Bunun yerine StringBuilder kullanmanız gerekir.StringBuilder sınıfından bir nesne örneği oluşturup, değişiklikleri bu örnek üzerinde yaptığınızda bellek üzerinde kopya bir instance oluşmayacak ve mevcut nesne örneği kullanılacaktır.Aşağıdaki örnekte main methodu içinde string tipinde userString ve StringBuilder tipinde userStringBuilder objeleri tanımlanmıştır. Her iki obje içindeki metinsel ifade değiştirilmiş ve hashCode’ları kontrol edilmiştir.
class Program
    {
        static void Main(string[] args)
        {
            string userString = "This sample is";
            Console.WriteLine("userString : " + userString);
            Console.WriteLine("HashCode : " + userString.GetHashCode().ToString());
            userString += " about the differences";
            Console.WriteLine("userString : " + userString);
            Console.WriteLine("HashCode : " + userString.GetHashCode().ToString());
            userString += " between string&String.Builder";
            Console.WriteLine("userString : " + userString);
            Console.WriteLine("HashCode : " + userString.GetHashCode().ToString());


            StringBuilder userStringBuilder = new StringBuilder();
            userStringBuilder.Append("This sample is");
            Console.WriteLine("userStringBuilder : " + userStringBuilder.ToString());
            Console.WriteLine("HashCode : " + userStringBuilder.GetHashCode().ToString());
            userStringBuilder.Append(" about the differences");
            Console.WriteLine("userStringBuilder : " + userStringBuilder.ToString());
            Console.WriteLine("HashCode : " + userStringBuilder.GetHashCode().ToString());
            userStringBuilder.Append(" between string&String.Builder");
            Console.WriteLine("userStringBuilder : " + userStringBuilder.ToString());
            Console.WriteLine("HashCode : " + userStringBuilder.GetHashCode().ToString());

            Console.ReadKey();
        }
    }

StringBuilder objesine string eklemek için StringBuilder sınıfının Append,AppendFormat ya da AppendLine methodları kullanılır. Programı derlediğinizde userString objesi için her defasında farklı hashCode’lar üretilirken, userStringBuilder objesine ait hashCode’un sabit kaldığını fakat içeriğini değiştiğini göreceksiniz.

stringBuilder

Kısacası StringBuilder’in kullanımı, içeriğini sürekli değiştirdiğimiz metinsel ifadeler için performans açısından daha uygun olacaktır.

Örnek kodları buradan indirebilirsiniz.Başka bir yazıda görüşmek üzere…

 

 

Bu Yazıyı Başkalarıyla Paylaş... Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestShare on TumblrEmail this to someone

Yorum Yapın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>