Wat is de Finalize-methode in C#?
sobes.tech AI
Antwoord van AI
De Finalize-methode in C# is een beschermde virtuele methode van de basisklasse System.Object, die wordt aangeroepen door de garbage collector (GC) net voordat het object uit het geheugen wordt verwijderd.
Het hoofddoel is het vrijmaken van niet-beheerde bronnen (bijvoorbeeld bestandsdeskriptoren, netwerk-sockets, pointers naar niet-beheerd geheugen), die niet direct door het .NET Framework worden gecontroleerd.
Hier zijn enkele belangrijke punten over Finalize:
- Het is niet gegarandeerd dat het wordt aangeroepen. De GC kan de finalisatie van het object overslaan als de applicatie eerder eindigt.
- De timing van de aanroep van
Finalizeis niet deterministisch. We kunnen niet precies weten wanneer de GC zal starten en de methode zal aanroepen. - Het uitvoeren van
Finalizekan tijd kosten, wat de werking van de GC kan vertragen. - Het wordt aanbevolen om het gebruik van
Finalizete vermijden en in plaats daarvan de interfaceIDisposableen deusing-verklaring te gebruiken. - In moderne versies van C# en .NET Framework wordt in plaats van expliciet overschrijven van
Finalizede syntax van destructor (finalizer) gebruikt, die door de compiler wordt omgezet in een overschrijving vanFinalize:
public class MyClassWithFinalizer
{
// Destructor - de compiler zet dit om in de `Finalize`-methode
~MyClassWithFinalizer()
{
// Code voor het vrijmaken van niet-beheerde bronnen
// Bijvoorbeeld: CloseHandle(myUnmanagedHandle);
System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
}
}
Het gebruik van IDisposable in combinatie met Finalize implementeert het Dispose-patroon:
public class MyDisposableResource : IDisposable
{
private bool disposed = false;
// Simulatie van een niet-beheerde bron
private System.IntPtr unmanagedResource;
public MyDisposableResource()
{
// Simulatie van het toewijzen van een niet-beheerde bron
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
System.Console.WriteLine("Niet-beheerde bron toegewezen.");
}
// Methode om bronnen vrij te maken
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Beheerde bronnen vrijmaken als disposing == true
// (is niet nodig in dit voorbeeld)
}
// Niet-beheerde bronnen vrijmaken in elk geval
if (unmanagedResource != System.IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = System.IntPtr.Zero;
System.Console.WriteLine("Niet-beheerde bron vrijgemaakt.");
}
disposed = true;
}
}
// Implementatie van IDisposable
public void Dispose()
{
Dispose(true);
// Aanroepen van de finalizer onderdrukken, omdat de bronnen al zijn vrijgegeven
System.GC.SuppressFinalize(this);
}
// Finalizer (destructor) - back-up mechanisme voor het vrijmaken van niet-beheerde bronnen
~MyDisposableResource()
{
Dispose(false);
System.Console.WriteLine("Finalizer called (as a fallback).");
}
}
Kortom, Finalize is een mechanisme als laatste redmiddel voor het vrijmaken van niet-beheerde bronnen, maar het gebruik ervan moet worden geminimaliseerd ten gunste van IDisposable.