Sobes.tech
Middle

Dispose ve Finalize yöntemleri arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dispose açıkça geliştirici veya çalışma zamanı ortamı (örneğin, using) tarafından çağrılır ve yönetilmeyen kaynakların serbest bırakılmasını sağlar. Finalize (C#'daki yıkıcı üzerinden) çöp toplayıcı tarafından nesne yok edilirken çağrılır, eğer nesne açıkça serbest bırakılmadıysa.

Kriter Dispose Finalize (yıkıcı üzerinden)
Çağrı Açıkça geliştirici tarafından (using, Dispose()) Otomatik olarak çöp toplayıcı tarafından
Çalışma zamanı Belirli (deterministik) Belirsiz (çöp toplayıcıya bağlı)
Amacı Yönetilen ve yönetilmeyen kaynakların serbest bırakılması Sadece yönetilmeyen kaynakların serbest bırakılması
Uygulama IDisposable arayüzü ile Object.Finalize metodunun üzerine yazılması (yıkıcı üzerinden)
Kullanım Kaynakları serbest bırakmak için tercih edilen yöntem Yönetilmeyen kaynaklar için yedek mekanizma

using kullanımı örneği (otomatik Dispose çağrısı):

// `IDisposable` uygulayan bir sınıfın kullanımı örneği
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Dosya ile çalışma
} // Burada otomatik olarak fileStream.Dispose() çağrılır

IDisposable ve yıkıcı içeren sınıf örneği:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // Yönetilmeyen kaynak
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Yönetilmeyen kaynağın başlatılması
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Kaynak tahsis edildi.");
    }

    // `IDisposable` uygulaması
    public void Dispose()
    {
        Dispose(true);
        // Finalizasyonu engelle, kaynak zaten serbest bırakıldı
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() çağrıldı.");
    }

    // Kaynakları serbest bırakmak için korumalı sanal metod
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Yönetilen kaynakların serbest bırakılması (varsa)
                Console.WriteLine("Yönetilen kaynaklar serbest bırakıldı.");
            }

            // Yönetilmeyen kaynakların serbest bırakılması
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("Yönetilmeyen kaynak serbest bırakıldı.");
            }

            disposed = true;
        }
    }

    // Yıkıcı (finalizer)
    ~MyDisposableClass()
    {
        Dispose(false); // Sadece yönetilmeyen kaynaklar
        Console.WriteLine("Finalizer çağrıldı.");
    }
}

Dispose metodu, yönetilmeyen kaynakları yöneten tüm sınıflar tarafından uygulanmalıdır (dosyalar, ağ bağlantıları, tanıtıcılar vb.). Finalize, Dispose çağrılmadığında bu kaynakların serbest bırakılması için yedek mekanizma olarak kullanılmalıdır. Finalize uygulayan sınıflar, kaynakların iki kez serbest bırakılmasını önlemek için Dispose(true) içinde çağrılarını devre dışı bırakmalıdır.