CodeBlanks Logo Icon CodeBlanks

Özet - Bellek ve GC

C# kursu · Uzman · Ders 6/47

IDisposable, using ve GC'yi birleştirerek bir kaynak havuzu yazarsın.

Özet - Bellek ve GC

Bu grupta GC'nin nesillerini (Gen 0/1/2), IDisposable ile kaynak yönetimini, using deyimini, GC.Collect'i ve LOH'yu öğrendin.

Bu kavramları bir araya getirerek yönetilen ve yönetilmeyen kaynakları güvenle kullanan kod yazabilirsin. Şimdi küçük bir kaynak havuzu ve toplama denetimi uygulayalım.

Uygulama Pool sınıfına Dispose ekle

Pool sınıfını : IDisposable ile tanımla. public void Dispose() gövdesinde Console.WriteLine("Havuz kapatıldı"); yaz. Main'de using var p = new Pool(); kullan.

Örnek çözümü göster
IDisposable { public void Dispose() { Console.WriteLine("Havuz kapatıldı"); } } yaz. Main'de using var p = new Pool();
Örnek çözüm:
using System;

class Pool : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Havuz kapatıldı");
    }
}

class Program
{
    static void Main()
    {
        using var p = new Pool();
    }
}

Finalizer ve dispose birlikte

Unutma: using yalnızca IDisposable ise çalışır. Sınıfın finalizer'ı varsa ve dispose edildiyse, GC.SuppressFinalize(this) ile finalizer'ı iptal etmek performansı artırır.

Doğru tasarlanmış bir sınıf Dispose'u çağırmayı unutmuş olsa bile finalizer sayesinde kaynağı geri kazanır. Bu güvenlik ağıdır; yine de elle Dispose çağırmak her zaman tercih edilir.

Uygulama LOH dizisi ve toplama

Main'de byte[] buf = new byte[100000]; ile LOH dizisi oluştur. Console.WriteLine("LOH ayrıldı"); yaz. Sonra GC.Collect(); çağır, en son Console.WriteLine("Toplandı"); yaz.

Örnek çözümü göster
byte[] buf = new byte[100000]; Console.WriteLine("LOH ayrıldı"); GC.Collect(); Console.WriteLine("Toplandı"); yaz.
Örnek çözüm:
using System;

class Program
{
    static void Main()
    {
        byte[] buf = new byte[100000];
        Console.WriteLine("LOH ayrıldı");
        GC.Collect();
        Console.WriteLine("Toplandı");
    }
}

Kendini test et

  1. Aşağıdakilerden hangisi using deyiminin avantajıdır?

    • Blok bitince otomatik Dispose
    • GC'yi hızlandırır
    • Belleği yeniden boyutlandırır
    • Thread oluşturur
    Cevabı göster

    Blok bitince otomatik Dispose — Doğru. using blok sonunda Dispose'u çağırır.

  2. Kavramları eşleştir

    IDisposable
    Dispose() metodu
    using
    Otomatik Dispose
    GC.Collect()
    Toplamayı zorla
    LOH
    ~85 KB+ nesneler

Uzman bölümündeki tüm dersler