Sobes.tech
Middle

Aký je rozdiel medzi metódami Dispose a Finalize?

sobes.tech AI

Odpoveď od AI

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

Kriterij Dispose Finalize (kroz destruktor)
Poziv Javno definiran od strane programera (using, Dispose()) Automatski od strane sakupljača smeća
Vreme izvršavanja Deterministično Nedeterministično (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; // Neovladan resurs
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Inicijalizacija neovladanog 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 neovladanih resursa
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("Neovladan resurs oslobođen.");
            }

            disposed = true;
        }
    }

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