.NET Lazy Sınıfı Nedir? ve Neden Kullanırız?

.NET’de çok küçük bir sınıf olan ve şimdilik 2 Özelliği bulunan bu Lazy sınıfı ile ihtiyaç duyduğumuz verinin ihtiyaç anında erişilebilmesi veya yapılacak işlemin ihtiyaç anında yapılması gibi durumlarda kullanabileceğimiz bu sınıf ile performans konusunda projenize katkı sağlayabilirsiniz.

.NET Lazy Sınıfı Nedir? ve Neden Kullanırız?

Lazy sınıfını bazı işlemleri geciktirmemizi ve böylelikle uygulamamamızın açılış süresini kısaltmaktadır. Aslında işlemi şuna benzetebiliriz EntityFramework kullananlar Where() ile query yazdığında Profiler’dan(Sql Server) yada Diagnostic Tools(Visual Studio) aracından baktığımızda herhangi bir sql isteği oluşturmadığını görüyoruz bu istek bazı linq metodları kullandığımızda oluşmaktadır. Bunlar FirstOrDefault(), SingleOrDefault(), ToList() v.b. metodlardır burada kurgu olarak benzer ama kullanım amacı farklı olmaktadır ama olayı anlama noktasında bu basit örnekle yola çıkıldığında daha anlaşılı olacağı kanaatindeyim.

Şimdi Generic Lazy sınıfının içeriğine biraz gözatalım.

ZGeneric Lazy sınıfının aslında hiçte komples bir yapıya sahip olmadığını görüyoruz kullanacağımız 2 Property var bunları işlev olarak şöyle anlatabiliriz IsValueCreated özelliği T generic tipi için vermiş olduğunuz tipin oluşturulup oluşturulmadığı ile ilgili true/false değeri döndürmektedir.

Value özelliği ise T generic tipimizi temsil etmektedir. Value özelliğine eriştiğiniz an T tipi Activator tarafından Create edilmektedir fakat eğer Constructor‘a Func<T> ile uyuşan bir metod verirseniz o metod Value özelliğine erişmeye çalıştığınızda tetiklenecek.

Şimdi basit bir yapıya sahip olan bu Lazy konusu için bir örnek yapalım.

Yeni bir C# konsol projesi oluşturuyoruz.

Basit Tiple Lazy Kullanımı

İlk örneğimiz gurgumuz şu şekilde olacak Person adında bir sınıfımız var ve Generic Lazy sınıfından Person tipi ile bir örnek alacağız. Person varsayılan yapıcı metoduna girildiğinde “Person consturtor’i çalıştı.” diye bir metin basacağız konsol ekranına böylelikle hangi aşamada çalıştığını göreceğiz.

Main metodu içerisindeki basit bir tiple Lazy tanımı yapıyoruz. Tanımımız şu şekilde.

Şimdi yazdığımız kodu adım adım yorumlayalım.

  • 2.satırda Lazy sınıfının generic tipine Person tipimizi vererek bir örnek aldık.
  • 5.satırda res.IsValueCreated ifadesi ile Person nesnemizin oluşup oluşmadığını sorguladık false döndü nedenine henüz Value özelliğine ihtiyaç duyup kullanmadık ne zaman value özelliğini kullanırsak o zaman Person nesnesi oluşacak.
  • 9.satırda artık Value özelliği olan Person nesnemize ihtiyacımız olduğunu belirtiyoruz ve Skill adlı IEnumerable<string> tipli özelliğimizde Count() linq metodu ile kaç kayıt olduğunu konsol ekrarnına basıyoruz. Bu arada Value özelliğini ilk defa kullandığımız için varsayılan kurucu metod çalıştı ve konsol ekranına “Person consturtor’i çalıştı.” metnini yazdı diğer işlemi olan Skill özelliğimize 3 eleman ekledik.
  • 12.satırda tekrar nesnenin oluşup oluşmadığını kontrol ediyoruz daha önce Value özelliğine eriştiğimiz için nesnenin oluştuğunu biliyoruz ve true değeri dönüyor.
  • 16.satırda Value özelliğini kullanarak tekrar Skill özelliğimizin count sayısını alıyoruz burada gördüğümüz gibi ikinci defa Person‘i create etmedi çünkü daha önce oluşturuldu bu tip Lazy sınıfından aldığımız örneğimiz içerisinde.

Çıktıyı şimdide konsol ekranında görelim.

Çıktı

Oluştumu: False
Person consturtor’i çalıştı.
3
Oluştumu: True
3

İlk örneğimiz için kodların tümü şu şekilde.

C#(LazyTest.cs)

Metod Tanımıyla Lazy Kullanımı

2Q==Aslında Lazy‘nin ihtiyaç duyulacağı kısım olarak burayı görüyorum. Nedeni ise çoğu zaman veritabanından gelen veri listesi yada statik olarak kodlarımızda yer alan bazı listeler üzerinde çalışırız ve bazı durumlarda bu liste yükleme işini uygulama ilk başladığında yaparız haliyle buda bir gecikmeye sebep olur. Burada şöyle bir kurgu ile uygulama açılışı daha hızlı hale getirebiliriz örneğin giriş yapmış bir kullanıcının Rollerini global bir özelliğe ataması yapılıyor ve ihtiyaç duyulduğunda kullanılıyor ama yükleme işi uygulama başlangıcında yapılıyor yine uygulama başlangıcından yapılsın ama Lazy ile yapılsın nedenide Lazy ile tanımlandığında veriye uygulama açılışında ihtiyaç duymayıp daha sonraki aşamalarda ihtiyaç duyuyorsak haliyle uygulamada bir performans artışı olacaktır uygulama başlangıcı için olan kurgumuzda.

Şimdi fazla konuşmadan hemen kodlamaya geçeyim 🙂

2Q==Bir önceki örneğimizden tek farkı geriye bir IEnumerable<Person> türü dönüyor olması ve constructor metoduna geri dönüş tipi IEnumerable<Person> türünde olan bir metodu veriyor olmamdır. Şimdi konsol çıktısına gözatalım.

Çıktı

Burada arkaplanın nasıl işlediği konusunda konuşalım daha önce belirttiğim gibi biz Value nesnesine eriştiğimiz an Activator ile T generic tipine vermiş tipimiz create edilmiş oluyor ve GetData adlı metodumuz ise invoke edilerek geriye dönen değer Value‘ya aktarılıyor. Diğer satırları bir önceki örnekte anlattığım için tekrar deyinmeyeceğim ama şunuda belirtip makaleye son vereyim GetData içerisine Value özelliğine ilk erişmemizde giriyor sonraki erişimlerde artık GetData metoduna giriş yapmıyor.

2.Örneğimiz İçin Tüm Kodlar

[fa class=”fa-github”] Bu makalede anlatılanlar ile ilgili proje için buraya tıklayıp github üzerinden ulaşabilirsiniz.

5/5 - (2 votes)

Murat Öner sitesinden daha fazla şey keşfedin

Okumaya devam etmek ve tüm arşive erişim kazanmak için hemen abone olun.

Okumaya devam et