Sobes.tech
Middle

IDisposable arayüzü nedir ve C#'ta ne amaçla kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

IDisposable — yönetilmeyen kaynakların serbest bırakılması için bir mekanizma sağlayan bir arayüzdür. Bir Dispose() yöntemi içerir.

Kullanım amaçları:

  • Yönetilmeyen kaynakların serbest bırakılması: dosya tanımlayıcıları, veritabanı bağlantıları, ağ soketleri gibi. .NET bu kaynakları otomatik olarak yönetemez.
  • Kullanımdan sonra temizlik: Kaynak yoğun nesnelerin doğru şekilde serbest bırakılmasını sağlar, hatta istisnalar oluşsa bile.
  • using operatörü ile birlikte kullanımı: using operatörü, kod bloğu sonunda Dispose() yöntemini otomatik olarak çağırır, hatta istisna olsa bile. Bu, IDisposable uygulayan nesnelerin kullanımı için tercih edilen yoldur.

Uygulama örneği:

public class MyResource : IDisposable
{
    // Yönetilmeyen kaynağın simülasyonu
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Yönetilmeyen kaynağın tahsisi
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` arayüzünden Dispose yöntemi
    public void Dispose()
    {
        Dispose(true);
        // Finalizasyonu engelle, çünkü kaynaklar zaten serbest bırakıldı
        GC.SuppressFinalize(this);
    }

    // Serbest bırakma mantığını uygulamak için sanal yöntem
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Yönetilen kaynakları serbest bırakma, varsa
                // ...
            }

            // Yönetilmeyen kaynakları serbest bırakma
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Kaynaklar manuel olarak çağrılmadığında serbest bırakmak için finalizer (yıkıcı)
    ~MyResource()
    {
        Dispose(false);
    }
}

using ile kullanım örneği:

using (var resource = new MyResource())
{
    // Kaynakla çalışma
    // ...
} // Dispose() otomatik olarak çağrılır, using bloğundan çıkarken