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.");
}
}