Lazy<T> Initialization: Performans ve Bellek Tasarrufu

Bazı nesneler oluşturması pahalıdır: veritabanı bağlantısı, büyük dosya yükleme, API çağrısı. Eğer hiç kullanılmazsa boşu boşuna bellek harcarsın. Lazy<T>, nesneyi sadece ilk kez erişildiğinde oluşturur. Sonraki erişimlerde aynı örneği kullanır.

Adım 1: Lazy<T> Tanımla

Lazy<T> bir wrapper'dır. İçinde bir fabrika fonksiyonu (factory) tutar. Gerçek nesne ilk erişime kadar oluşturulmaz.

Adım 2: Value Özelliğine Eriştiğinde Başlatılır

`.Value` çağırdığında:
- İlk kez: nesne oluşturulur, belleğe kaydedilir
- Sonraki kez: aynı nesne döndürülür

Adım 3: Bellek Tasarrufu Sağlanır

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Kullanılmayan nesneler hiç oluşturulmaz.

Bir veritabanı bağlantısı sınıfı düşün:

1using System;
2
3public class DatabaseConnection
4{
5public string ConnectionString { get; set; }
6
7public DatabaseConnection()
8{
9System.Threading.Thread.Sleep(2000); // 2 saniye simülasyon
10ConnectionString = "Server=localhost;Database=MyDB";
11Console.WriteLine("Veritabanı bağlantısı oluşturuldu!");
12}
13}
14
15class Program
16{
17static void Main()
18{
19// Lazy<T> ile tanımla
20var lazyDb = new Lazy<DatabaseConnection>(
21() => new DatabaseConnection()
22);
23
24Console.WriteLine("Program başladı");
25System.Threading.Thread.Sleep(500);
26
27// Henüz oluşturulmadı!
28Console.WriteLine("Hala bağlantı yok");
29
30// İlk erişim: oluşturulur
31Console.WriteLine("\nBağlantıya erişiliyor...");
32var connection1 = lazyDb.Value;
33Console.WriteLine($"Bağlantı: {connection1.ConnectionString}");
34
35// İkinci erişim: aynı nesne döndürülür (yeniden oluşturulmaz)
36Console.WriteLine("\nTekrar erişiliyor...");
37var connection2 = lazyDb.Value;
38Console.WriteLine($"Aynı nesne mi? {ReferenceEquals(connection1, connection2)}");
39}
40}

Beklenen Çıktı:

1Program başladı
2Hala bağlantı yok
3
4Bağlantıya erişiliyor...
5Veritabanı bağlantısı oluşturuldu!
6Bağlantı: Server=localhost;Database=MyDB
7
8Tekrar erişiliyor...
9Aynı nesne mi? True

- İlk erişim gecikmeli: `.Value` çağrılana kadar hiçbir şey yapılmaz
- Tekil örnek: İkinci ve sonraki erişimlerde yeniden oluşturulmaz
- Thread-safe: `Lazy<T>` varsayılan olarak kilit kullanarak güvenlidir
- Bellek kazancı: Kullanılmayan ağır nesneler asla belleğe gelmez

- Pahalı nesneler (veritabanı, API, dosya)
- Opsiyonel bağımlılıklar (gerekirse yükle)
- Singleton pattern'ında (tek örnek garantisi)

(Cache Invalidation Sorunları: TTL ve Event-Driven Strateji Seçimi)

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz