Sobes.tech
Middle

Dispose жана Finalize ыкмаларынын айырмасы эмнеде?

sobes.tech AI

AIден жооп

Dispose ачык түрдө иштеп чыгуучу же ишке ашыруу чөйрөсү (мисалы, using) тарабынан чакырылат жана башкарылуучу эмес ресурстарды бошотуу үчүн колдонулат. Finalize (C#да деструктор аркылуу) жыйноочу тарабынан объект жоголгондо, эгер ал ачык түрдө бошотулбаса, чакырылат.

Критерий Dispose Finalize (деструктор аркылуу)
Чакыруу Ачык түрдө иштеп чыгуучу тарабынан белгиленет (using, Dispose()) Автоматтык түрдө жыйноочу тарабынан чакырылат
Ишке ашыруу убактысы Детерминистик Недоминатсиондук (жыйноочу тарабынан көз каранды)
Максаты Башкарылуучу жана башкарылбаган ресурстарды бошотуу Жана башкарылбаган ресурстарды гана бошотуу
Ишке ашыруу IDisposable интерфейсин ишке ашыруу Object.Finalize методун кайра иштеп чыгуу (деструктор аркылуу)
Колдонуу Ресурстарды бошотуу үчүн артыкчылыктуу ыкма Эки жолу бошотуунун алдын алуу үчүн резервдик механизм

using колдонуу мисалы (автоматтык Dispose чакыруу):

// `IDisposable` ишке ашырган класстын мисалы
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Файл менен иштөө
} // Бул жерде автоматтык түрдө fileStream.Dispose() чакырылат

IDisposable жана деструктор менен класс мисалы:

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;
        }
    }

    // Деструктор (финализатор)
    ~MyDisposableClass()
    {
        Dispose(false); // Жай гана башкарылбаган ресурстарды бошотуу
        Console.WriteLine("Финализатор чакырылды.");
    }
}