Sobes.tech
Middle

Kāda ir atšķirība starp metodēm Dispose un Finalize?

sobes.tech AI

Atbilde no AI

Dispose tiek kvēlēts skaidri izstrādātāja vai izpildes vidē (piemēram, using) atbrīvot nevaldāmus resursus. Finalize (caur destruktoru C#) tiek izsaukts atkritumu savācējs, kad objekts tiktu 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.");
    }
}

Dispose metodei jābūt realizētai visām klasēm, kas pārvalda nevaldāmus resursus (failus, tīkla savienojumus, deskriptors u.c.). Finalize jāizmanto kā rezerves veids, lai atbrīvotu nevaldāmus resursus gadījumā, ja Dispose nav izsaukts. Klases, kas realizē Finalize, jāslēpj tā izsaukums Dispose(true), lai izvairītos no dubultas resursu atbrīvošanas.