Sobes.tech
Middle

C# dilində Finalize metodu nədir?

sobes.tech Süni İntellekt

AI-dan cavab

C# dilində Finalize metodu, əsas sinif System.Object-in qorunan virtual metodudur və obyekt yaddaşdan silinməzdən əvvəl toplayıcı (GC) tərəfindən çağrılır.

Əsas məqsədi, idarə olunmayan resursları (məsələn, fayl deskriptorları, şəbəkə sobaları, idarə olunmayan yaddaş göstəriciləri) sərbəst buraxmaqdır; bunlar .NET Framework tərəfindən birbaşa idarə olunmur.

Budur Finalize haqqında bəzi əsas nöqtələr:

  • Bu zəmanət edilmir ki, çağrılacaq. GC, tətbiq əvvəlcədən bitərsə, obyektin finalizasiyasını həyata keçirməyə bilər.
  • Finalize-in çağırılma vaxtı deterministik deyil; GC'nin nə vaxt başlayıb və metodu çağıracağını tam olaraq bilmirik.
  • Finalize-in icrası zaman ala bilər, bu da GC-nin işini yavaşlada bilər.
  • Finalize istifadə etmək tövsiyə edilmir, onun yerinə IDisposable interfeysi və using bəyanatından istifadə edin.
  • Müasir C# və .NET Framework versiyalarında, açıq şəkildə Finalize-i yenidən yazmaq əvəzinə, destruktor (finalizator) sintaksisi istifadə olunur və tərtibçi bunu Finalize-ə çevirir:
public class MyClassWithFinalizer
{
    // Destruktor - tərtibçi onu `Finalize` metoduna çevirir
    ~MyClassWithFinalizer()
    {
        // İdarə olunmayan resursların sərbəst buraxılması üçün kod
        // Məsələn: CloseHandle(myUnmanagedHandle);
        System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
    }
}

IDisposable ilə Finalize birlikdə istifadə edilərək Dispose nümunəsi həyata keçirilir:

public class MyDisposableResource : IDisposable
{
    private bool disposed = false;
    // İdarə olunmayan resursun simulasyonu
    private System.IntPtr unmanagedResource;

    public MyDisposableResource()
    {
        // İdarə olunmayan resursun ayırmasının simulasyonu
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
        System.Console.WriteLine("İdarə olunmayan resurs ayırıldı.");
    }

    // Resursları sərbəst buraxmaq üçün metod
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // `disposing == true` olsa, idarə olunan resurslar sərbəst buraxılır
                // (bu nümunədə lazım deyil)
            }

            // Hər halda idarə olunmayan resurslar sərbəst buraxılır
            if (unmanagedResource != System.IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = System.IntPtr.Zero;
                System.Console.WriteLine("İdarə olunmayan resurs sərbəst buraxıldı.");
            }

            disposed = true;
        }
    }

    // IDisposable tətbiqi
    public void Dispose()
    {
        Dispose(true);
        // Finalizator çağırışını ləğv et, çünki resurslar artıq sərbəst buraxılıb
        System.GC.SuppressFinalize(this);
    }

    // Finalizator (destruktor) - idarə olunmayan resursların sərbəst buraxılması üçün ehtiyat mexanizmi
    ~MyDisposableResource()
    {
        Dispose(false);
        System.Console.WriteLine("Finalizer called (as a fallback).");
    }
}

Nəticədə, Finalize idarə olunmayan resursların sərbəst buraxılması üçün son şans mexanizmidir, lakin onun istifadəsi IDisposable-ə üstünlük verilməklə minimal səviyyədə saxlanmalıdır.