Sobes.tech
Middle

Mis on Finalize meetod C#-s?

sobes.tech AI

Vastus AI-lt

Finalize meetod C# ir aizsargāts virtuāls pamatklases System.Object metodes, kas tiek izsaukts atkritumu savācēja (GC) tieši pirms objekts tiks dzēsts no atmiņas.

Tās galvenais mērķis ir atbrīvot neuzraudzītus resursus (piemēram, failu atslēgas, tīkla soketus, norādes uz neuzraudzītiem atmiņas resursiem), kuri netiek tieši kontrolēti ar .NET Framework.

Šeit ir daži galvenie punkti par Finalize:

  • Tas nav garantēti tiks izsaukts. GC var neizsaukt finalizāciju, ja lietojumprogramma beidzas agrāk.
  • Finalize izsaukšanas laiks nav deterministiskais. Mēs nevaram precīzi zināt, kad GC tiks aktivizēts un izsauks metodi.
  • Finalize izpilde var aizņemt laiku, kas var palēnināt GC darbību.
  • Ieteicams izvairīties no Finalize izmantošanas resursu atbrīvošanai, izmantojiet vietā interfeisu IDisposable un operatoru using.
  • Mūsdienu C# un .NET Framework versijās vietā, lai tieši pārdefinētu Finalize, tiek izmantots destruktora (finalizatora) sintakse, ko kompilators pārveido par Finalize pārdefinējumu:
public class MyClassWithFinalizer
{
    // Destruktors - kompilators to pārveido par `Finalize` metodi
    ~MyClassWithFinalizer()
    {
        // Kods neuzraudzītu resursu atbrīvošanai
        // Piemēram: CloseHandle(myUnmanagedHandle);
        System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
    }
}

IDisposable izmantošana kopā ar Finalize realizē Dispose paraugu:

public class MyDisposableResource : IDisposable
{
    private bool disposed = false;
    // Neuzraudzīta resursa imitācija
    private System.IntPtr unmanagedResource;

    public MyDisposableResource()
    {
        // Neuzraudzīta resursa piešķiršana
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
        System.Console.WriteLine("Unmanaged resource allocated.");
    }

    // Resursu atbrīvošanas metode
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Atbrīvot pārvaldītos resursus, ja `disposing == true`
                // (šajā piemērā nav nepieciešams)
            }

            // Atbrīvot neuzraudzītos resursus jebkurā gadījumā
            if (unmanagedResource != System.IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = System.IntPtr.Zero;
                System.Console.WriteLine("Unmanaged resource freed.");
            }

            disposed = true;
        }
    }

    // Iesniegums par IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Aizkavē finalizatora izsaukšanu, jo resursi jau ir atbrīvoti
        System.GC.SuppressFinalize(this);
    }

    // Finalizators (distruktors) - rezerves mehānisms neuzraudzītu resursu atbrīvošanai
    ~MyDisposableResource()
    {
        Dispose(false);
        System.Console.WriteLine("Finalizer called (as a fallback).");
    }
}