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.