Sobes.tech
Middle

Koja je razlika između metoda Dispose i Finalize?

sobes.tech АИ

Одговор од АИ

Dispose se poziva eksplicitno od strane programera ili okruženja za izvršavanje (npr. using) radi oslobađanja neuređenih resursa. Finalize (kroz destruktor u C#) se poziva od strane sakupljača smeća pri uništavanju objekta, ako taj objekat nije eksplicitno oslobođen.

Kriterijum Dispose Finalize (kroz destruktor)
Poziv Javno definisan od strane programera (using, Dispose()) Automatski od strane sakupljača smeća
Vreme izvršavanja Determinističko Nedeterminističko (zavisi od sakupljača smeća)
Svrha Oslobađanje kako upravljanih, tako i neupavljanih resursa Oslobađanje samo neupavljanih resursa
Implementacija Implementacija interfejsa IDisposable Prepisivanje metode Object.Finalize (kroz destruktor)
Korišćenje Preferirani način oslobađanja resursa Rezervni mehanizam za neupavljane resurse ako Dispose nije pozvan

Primer korišćenja using (automatski poziv Dispose):

// Primer klase koja implementira `IDisposable`
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Rad sa fajlom
} // Ovde se automatski poziva fileStream.Dispose()

Primer klase sa IDisposable i destruktorom:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // Neupavljan resurs
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Inicijalizacija neupavljanog resursa
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Resurs alociran.");
    }

    // Implementacija `IDisposable`
    public void Dispose()
    {
        Dispose(true);
        // Potiskivanje finalizatora, jer je resurs već oslobođen
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() pozvano.");
    }

    // Zaštićena virtuelna metoda za oslobađanje resursa
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Oslobađanje upravljanih resursa (ako ih ima)
                Console.WriteLine("Oslobađanje upravljanih resursa.");
            }

            // Oslobađanje neupavljanih resursa
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("Neupavljan resurs oslobođen.");
            }

            disposed = true;
        }
    }

    // Destruktor (finalizator)
    ~MyDisposableClass()
    {
        Dispose(false); // Oslobađa samo neupavljane resurse
        Console.WriteLine("Finalizator pozvan.");
    }
}