Sobes.tech
Middle

Dispose və Finalize metodları arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Dispose açıq şəkildə inkişaf etdirici və ya icra mühiti (məsələn, using) tərəfindən çağırılır və idarə olunmayan resursların azad olunması üçün istifadə olunur. Finalize (C#-də destruktor vasitəsilə) isə obyekt məhv edilərkən, əgər açıq şəkildə azad edilməyibsə, toplanıcı tərəfindən çağırılır.

Kriteriya Dispose Finalize (destruktor vasitəsilə)
Çağırış Aydın şəkildə inkişaf etdirici tərəfindən təyin edilir (using, Dispose()) Avtomatik olaraq toplayıcı tərəfindən çağırılır
İcranın vaxtı Deterministik Deterministik olmayan (toplayıcının qərarına bağlı)
Təyinatı İdarə olunan və idarə olunmayan resursların azad edilməsi Yalnız idarə olunmayan resursların azad edilməsi
Tətbiqi IDisposable interfeysinin tətbiqi Object.Finalize metodunun override edilməsi (destruktor sintaksisi ilə)
İstifadəsi Resursların azad olunması üçün üstün üsul İdarə olunmayan resurslar üçün ehtiyat mexanizmi

using istifadə nümunəsi (avtomatik Dispose çağırışı):

// IDisposable tətbiq edən sinif nümunəsi
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Fayl ilə işləmə
} // Burada avtomatik olaraq fileStream.Dispose() çağırılır

IDisposable və destruktor ilə sinif nümunəsi:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // İdarə olunmayan resursu təmsil edir
    private bool disposed = false;

    public MyDisposableClass()
    {
        // İdarə olunmayan resursun ilkinləşdirilməsi
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Resurs ayrıldı.");
    }

    // IDisposable tətbiqi
    public void Dispose()
    {
        Dispose(true);
        // Finalizasiyanı ləğv et, çünki resurs artıq azad olunub
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() çağırıldı.");
    }

    // Resursların azad olunması üçün qorunan virtual metod
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // İdarə olunan resursların azad olunması (əgər varsa)
                Console.WriteLine("İdarə olunan resursların azad olunması.");
            }

            // İdarə olunmayan resursların azad olunması
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("İdarə olunmayan resurs azad edildi.");
            }

            disposed = true;
        }
    }

    // Destruktor (finalizator)
    ~MyDisposableClass()
    {
        Dispose(false); // Yalnız idarə olunmayan resursları azad edir
        Console.WriteLine("Finalizator çağırıldı.");
    }
}

Dispose metodu, idarə olunmayan resursları idarə edən bütün siniflər üçün tətbiq olunmalıdır (fayllar, şəbəkə əlaqələri, deskriptorlar və s.). Finalize isə Dispose çağırılmadıqda idarə olunmayan resursların ehtiyat olaraq azad olunması üçün istifadə olunur. Finalize-ı tətbiq edən siniflər Dispose(true) daxilində onun çağırılmasını ləğv etməlidir ki, resursların iki dəfə azad olunmasının qarşısı alınsın.