Sobes.tech
Middle

Mis vahe on meetoditel Dispose ja Finalize?

sobes.tech AI

Vastus AI-lt

Dispose tiek izsaukts skaidri izstrādātāja vai izpildes vidē (piemēram, using) resursu atbrīvošanai. Finalize (caur destruktoru C#) tiek izsaukts atkritumu savācējs, kad objekts tiek iznīcināts, ja tas netika skaidri atbrīvots.

Kritērijs Dispose Finalize (caur destruktoru)
Izsaukums Skaidri norādīts izstrādātāja (using, Dispose()) Automātiski izsauc atkritumu savācējs
Izpildes laiks Determinēts Neterminēts (atkarīgs no atkritumu savācēja)
Mērķis Atbrīvot gan pārvaldām, gan nevaldāmus resursus Tikai nevaldāmu resursu atbrīvošana
Realizācija IDisposable interfeiss Object.Finalize metode pārrakstīta (caur destruktora sintaksi)
Izmantošana Galvenais veids resursu atbrīvošanai Rezerves mehānisms nevaldāmu resursu atbrīvošanai

Piemērs ar using (automātiska Dispose izsaukšana):

// Piemērs ar `IDisposable` realizējošu klasi
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Darbs ar failu
} // Šeit automātiski izsaucas fileStream.Dispose()

Klases ar IDisposable un destruktoru piemērs:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // Attēlo nevaldāmu resursu
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Nevaldāma resursa inicializācija
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Resurss piešķirts.");
    }

    // `IDisposable` realizācija
    public void Dispose()
    {
        Dispose(true);
        // Slēpt finalizāciju, jo resurss jau ir atbrīvots
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() izsaukts.");
    }

    // Aizsargāts virtuāls resurss atbrīvošanas metodes
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Pārvaldāmu resursu atbrīvošana (ja ir)
                Console.WriteLine("Pārvaldāmu resursu atbrīvošana.");
            }

            // Nevaldāmu resursu atbrīvošana
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("Nevaldāms resurss atbrīvots.");
            }

            disposed = true;
        }
    }

    // Destruktors (finiators)
    ~MyDisposableClass()
    {
        Dispose(false); // Atbrīvot tikai nevaldāmos resursus
        Console.WriteLine("Finiators izsaukts.");
    }
}