Sobes.tech
Middle

Тафовут байни усулҳои Dispose ва Finalize чист?

sobes.tech AI

Ҷавоб аз AI

Dispose баъси равшанан аз ҷониби таҳиягар ё муҳити иҷро (масалан, using) барои озод кардани захираҳои ғайриназоратшаванда. Finalize (бо воситаи destructor дар C#) аз ҷониби ҷамъкунандаи партовҳо ҳангоми нобуд кардани объект, агар он ба таври равшан озод нашуда бошад, даъват мешавад.

Критерий Dispose Finalize (бо воситаи destructor)
Даъват Равшан аз ҷониби таҳиягар (using, Dispose()) Автоматӣ аз ҷониби ҷамъкунандаи партовҳо
Вақти иҷро Детерминатсионӣ Недоминатсионӣ (зависит аз ҷамъкунандаи партовҳо)
Мақсад Озод кардани ҳам захираҳои идорашаванда ва ҳам ғайриҳадафӣ Озод кардани танҳо захираҳои ғайриҳадафӣ
Имплементация Имплементацияи IDisposable Писхӯрии методи Object.Finalize (бо воситаи destructor)
Истифода Роҳи афзалиятноки озод кардани захираҳо Механизми эҳтиётӣ барои захираҳои ғайриҳадафӣ агар Dispose нарасида бошад

Масалан барои истифодаи using (даъвати автоматии Dispose):

// Масалан барои синфе, ки `IDisposable`-ро амалӣ мекунад
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Кор бо файл
} // Ин ҷо автоматӣ даъват мешавад fileStream.Dispose()

Масалан барои синф бо IDisposable ва destructor:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // Захираи ғайриҳадафӣ
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Инициализатсияи захираи ғайриҳадафӣ
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Захира таъин шуд.");
    }

    // Имплементацияи IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Нотоли финализатор, зеро захира аллакай озод шудааст
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() даъват шуд.");
    }

    // Метод ҳимояшудаи виртуалӣ барои озод кардани захираҳо
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Озод кардани захираҳои идорашаванда (агар мавҷуд бошанд)
                Console.WriteLine("Озод кардани захираҳои идорашаванда.");
            }

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

            disposed = true;
        }
    }

    // Destructor (финализатор)
    ~MyDisposableClass()
    {
        Dispose(false); // Танҳо захираҳои ғайриҳадафӣ озод мекунад
        Console.WriteLine("Финализатор даъват шуд.");
    }
}