Lazy Initialization (Yavaş Başlangıç)

Eyl 06, 2013

Bir program çalışmaya başladığı zaman bellekte büyük veya küçük nesneler oluşturur. Oluşturulan bu nesneler kullanılsa da kullanılmasa da bellekte hazır halde bekler. Küçük boyutlu nesneler oluşturulduğunda sorun yaratmayabilir. Ancak büyük boyuttaki nesneler programın başında yaratıldığı zaman gereksiz yere bellek kullanımı olduğundan sistemi yavaşlatabilir. Fakat nesne kullanılacağı zaman yaratılırsa program performans bakımından daha verimli çalışır. Lazy (Yavaş) sınıfıFramework 4.0 ile beraber gelmiş yeni özelliklerden bir tanesidir ve nesnenin kullanılacağı zaman yaratılmasına olanak sağlar. Lazy sınıfı ile nesneler oluşturulduğu zaman nesne hemen oluşmaz, programın neresinde kullanılacaksa o zaman oluşur. Bu da program çalışmaya başladığı andan itibaren gereksiz bellek kullanımını engeller.

Lazy sınıfının özellikleri aşağıda anlatılmıştır:

  • IsValueCreated: Nesenin yaratılıp yaratılmadığını kontrol etmek için kullanılan bir özelliktir. Özellik bool değer dönderir, eğer sonuç true(doğru) dönerse nesne yaratılmıştır, false(yanlış) dönerse nesne yaratılmamıştır.
  • Value: Nesneyi kullanmak için gereken özelliktir. Nesnenin içeriği bu özellik ile kullanılabilir.

Uygulama:

    private Lazy<IList<Address>> adres;
    public Lazy<IList<Address>> Adres
    {
        get
        {
            if (adres == null)
                adres = new Lazy<IList<Address>>(() => PE.GetAddress());
            return adres;
        }
    }

Öncelikle Lazy sınıfı kullanılarak nesne yaratılır. Bu Nesne liste içerikli olduğu için IList sınıfı Lazy sınıfının içinde kullanılır. Verileri almak için GetAddress() metodu çağırılır.

    public IList<Address> GetAddress()
    {
        var query = from o in Address
                          select o;
        return query.ToList();
    }

GetAddress() metodu veritabanındaki Address tablosundan veri çekmektedir.

    public void Kontrol()
    {
        if (Adres.IsValueCreated == true)
            lblAddress.Text = "<b>Yaratıldı.</b>";
        else
            lblAddress.Text = "Yaratılmadı.";
    }

Bu metod kontrol amaçlı kullanılmıştır. Lazy sınıfının IsValueCreated özelliğini kullanarak nesnenin yaratılıp yaratılmadığını kontrol ediyor.

    public void lbAddress_Click(object sender, EventArgs e)
    {
        rpAddress.DataSource = Adres.Value;
        rpAddress.DataBind();
    }

Buradaki metod nesnenin kullanılmasını sağlıyor. Daha sonra da VeriBagla() metodu nesnenin yaratılıp yaratılmadığını kontrol ediyor.

Uygulama çalıştırıldığında aşağıdaki görüntüler elde edilir.

Program ilk çalıştığında Kontrol() metodu nesnenin yaratılıp yaratılmadığına bakıyor. Metod nesnenin oluşmadığını gösteriyor.

Nesnenin içeriğine bakmak için "Address" düğmesine tıklandığında Kontrol() metodu tekrar çalıştırılıyor ve nesnenin yaratıldığını gösteriyor.