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
Kullanılmayan nesneler hiç oluşturulmaz.
Bir veritabanı bağlantısı sınıfı düşün:
1using System;23public class DatabaseConnection4{5public string ConnectionString { get; set; }67public DatabaseConnection()8{9System.Threading.Thread.Sleep(2000); // 2 saniye simülasyon10ConnectionString = "Server=localhost;Database=MyDB";11Console.WriteLine("Veritabanı bağlantısı oluşturuldu!");12}13}1415class Program16{17static void Main()18{19// Lazy<T> ile tanımla20var lazyDb = new Lazy<DatabaseConnection>(21() => new DatabaseConnection()22);2324Console.WriteLine("Program başladı");25System.Threading.Thread.Sleep(500);2627// Henüz oluşturulmadı!28Console.WriteLine("Hala bağlantı yok");2930// İlk erişim: oluşturulur31Console.WriteLine("\nBağlantıya erişiliyor...");32var connection1 = lazyDb.Value;33Console.WriteLine($"Bağlantı: {connection1.ConnectionString}");3435// İ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ı yok34Bağlantıya erişiliyor...5Veritabanı bağlantısı oluşturuldu!6Bağlantı: Server=localhost;Database=MyDB78Tekrar 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)
0 yorum