Sobes.tech
Middle

Методи Finalize дар C# чист?

sobes.tech AI

Ҷавоб аз AI

Метод Finalize дар C# — это муҳофизатшудаи виртуалӣ дар асоси System.Object, ки аз ҷониби ҷамъкунандаи партовҳо (GC) бевосита пеш аз он ки объект аз ёддошт хориҷ шавад, даъват мешавад.

Мақсади асосии он озод кардани захираҳои ғайриҳуқуқӣ (масалан, дескрипторҳои файлҳо, сокуҳои шабакавӣ, ишораҳо ба ёддоштҳои ғайриҳуқуқӣ), ки мустақиман аз ҷониби .NET Framework назорат намешаванд.

Инҷо чанд нуқтаи калидӣ дар бораи Finalize:

  • Гарантӣ нест, ки даъват мешавад. GC метавонад финализатсияи объектро гузарад, агар барнома пештар ба итмом расад.
  • Вақти даъвати Finalize детерминистикӣ нест. Мо наметавонем дақиқ бидонем, кай GC оғоз мешавад ва методро даъват мекунад.
  • иҷрои Finalize метавонад вақт бигирад, ки метавонад кори GC-ро суст кунад.
  • Тавсия дода мешавад, ки истифодаи Finalize барои озод кардани захираҳо кам карда шавад, ва ба ҷои он интерфейси IDisposable ва оператори using истифода шавад.
  • Дар версияҳои муосири C# ва .NET Framework, ба ҷои иваз кардани Finalize ба таври ошкор, синтаксиси деструктор (финализатор) истифода мешавад, ки компилятор онро ба иваз кардани Finalize табдил медиҳад:
public class MyClassWithFinalizer
{
    // Деструктор — компилятор онро ба методи Finalize табдил медиҳад
    ~MyClassWithFinalizer()
    {
        // Код барои озод кардани захираҳои ғайриҳуқуқӣ
        // Масалан: CloseHandle(myUnmanagedHandle);
        System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
    }
}

Истифодаи IDisposable дар якҷоягӣ бо Finalize паттерни Dispose-ро амалӣ мекунад:

public class MyDisposableResource : IDisposable
{
    private bool disposed = false;
    // Имитацияи захираи ғайриҳуқуқӣ
    private System.IntPtr unmanagedResource;

    public MyDisposableResource()
    {
        // Имитацияи тақсимоти захираи ғайриҳуқуқӣ
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
        System.Console.WriteLine("Unmanaged resource allocated.");
    }

    // Методи озод кардани захираҳо
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Озод кардани захираҳои идорашаванда, агар disposing == true
                // (дар ин намуна зарурат нест)
            }

            // Озод кардани захираҳои ғайриҳуқуқӣ дар ҳар ҳолат
            if (unmanagedResource != System.IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = System.IntPtr.Zero;
                System.Console.WriteLine("Unmanaged resource freed.");
            }

            disposed = true;
        }
    }

    // Иҷрои IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Тамъам кардани даъвати финализатор, зеро захираҳо аллакай озод шудаанд
        System.GC.SuppressFinalize(this);
    }

    // Финализатор (деструктор) — механизм барои озод кардани захираҳои ғайриҳуқуқӣ
    ~MyDisposableResource()
    {
        Dispose(false);
        System.Console.WriteLine("Finalizer called (as a fallback).");
    }
}

Бинобар ин, Finalize механизмест барои охирин имконият озод кардани захираҳои ғайриҳуқуқӣ, аммо истифодаи он бояд кам карда шавад дар фоидаи IDisposable.