Statik Değişkenler ve Garbage Collection

Günümüzde uygulamalar büyüyüp, çalıstıkları cihazlar küçüldükçe bellek kullanımı daha da önemli hale geliyor. Ben de uygulamalarımızda bellek kullanımını azaltacak basit ve bilinen ama oldukça önemli bir kaç şeyden bahsetmek istiyorum. Bunlar statik değişkenler ve garbage collector.

Statik değişkenlerin normal değişkenlerden farkı statik değişkenlere ulaşmak için yeni bir nesne oluşturmamız gerekmez, sınıfımız üzerinden bu değişkenlere erişebiliriz. Ayrıca statik olmayan değişkenlerimiz her nesne ile ayrı olarak oluşturulur ve farklı degerlere sahip olur ama statik değişkenlerin tek bir değeri vardır. Örneğin uygulamamızda bir sınıftan sadece 3 tane nesne olusturulmasına izin vermemiz gerektiğini düşünelim. Eğer böyle bir durumda statik bir değisken kullanmasaydık, her nesne oluşturduğumuzda geçici nesneler oluşturup,, bu geçici değiskenlerin değerlerini artırıp bir yerde tutmamız gerekecekti. Bu da zaman ve bellek kaybı demek olurdu. Ancak statik değiskenler sayesinde tek bir değisken aracılığıyla kontrolümüzü sağlayabiliriz. Statik degişkenlerin mantığını anlamak için basit bir kod yazalım.
Öncelikle bir tane sınıf oluşturalım.
    
    class StatikDeneme
    {
        private int deger=0;
        public static int statikDeger=0;
 
        public int Deger
        {
            get
            {
                return deger; 
            }
            set
            {
                deger = value;
            }
        }

    }

Daha sonra formumuzun üzerine 2 tane buton sürükleyelim ve butonlaın altına sırayla şu kodları yazalım.

        private void button1_Click(object sender, EventArgs e)
        {
            StatikDeneme cs = new StatikDeneme();
            cs.Deger = 4;
            cs.Deger++;
            StatikDeneme.statikDeger++;
            MessageBox.Show(cs.Deger.ToString() + ”  ” + Class1.statikDeger.ToString());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StatikDeneme cs = new StatikDeneme();
            cs.Deger = 4;
            cs.Deger++;
            StatikDeneme.statikDeger++;
            MessageBox.Show(cs.Deger.ToString() + ”  ” + Class1.statikDeger.ToString());
        }

Gördügümüz gibi iki butonumuzun altındaki kod da aynı. Simdi uygulamamızı çalıştırıp rasgele butonlara basalım. Butonlara her basışımızda ilk (statik olmayan) değer değismezken, ikinci (statik olan) değerin arttığını görebiliriz. Bu şekilde statik bir değişkenle kolayca SingleTon desenini uygulayabiliriz.

Garbage Collector’lara gelince. GC’ler uygulama sırasında oluşturulmuş ancak kullanılmayan değiskenlerin yok edilmesini sağlar. Böylece nesneler hafızada gereksiz yer kaplamamış olur. GC’lar C# ta otomatik olarak çağrılır. Geliştirici bu zamanı bilemez ancak System.GC.Collect() metodu ile istedigi zaman bu işlemi gerçekleştirebilir. Yıkıcı metodlar (Destructor) nesnelerin yok edilmesinden hemen önce çağrılır. C++’da nesneler yok edilirken, bellekte oluşturulan dinamik alanlar iade edilmez. Bu nedenle geliştiricinin yıkıcı metod içinde bu alanlarıiade etmesi gerekir. C#’ta ise bu bellek alanlarının iadesi otomatik olarak yapılır. Bu nedenle yıkıcı metodlar genellikle statik veya global degiskenlerin değerlerini değiştirme amacı ile kullanılır. Örneğin uygulamamızda sadece 5 veritabanı bağlantısına izin vereceğimizi düşünelim. Bu durumda statik değişkenimizi yapıcı metodlarda bir artırırız ve 5’e ulaşıp ulaşmadığını kontrol ederek bağlantı nesnesinin oluşturulmasına izin veririz. Bağlantı nesnesinin yıkıcı metodunda ise statik değişsken değerimizi bir azaltırız. Böylece bir bağlantı nesnesi ne ihtiyaç kalmadığı zaman nesne yok edilirken, biz de bir bağlantı nesnesi hakkı daha kazanmış oluruz.