Middle
Mis on Finalize meetod C#-s?
sobes.tech AI
Vastus AI-lt
Finalize meetod C# ir aizsargāts virtuāls pamatklases System.Object metodes, kas tiek izsaukts atkritumu savācēja (GC) tieši pirms objekts tiks dzēsts no atmiņas.
Tās galvenais mērķis ir atbrīvot neuzraudzītus resursus (piemēram, failu atslēgas, tīkla soketus, norādes uz neuzraudzītiem atmiņas resursiem), kuri netiek tieši kontrolēti ar .NET Framework.
Šeit ir daži galvenie punkti par Finalize:
- Tas nav garantēti tiks izsaukts. GC var neizsaukt finalizāciju, ja lietojumprogramma beidzas agrāk.
Finalizeizsaukšanas laiks nav deterministiskais. Mēs nevaram precīzi zināt, kad GC tiks aktivizēts un izsauks metodi.Finalizeizpilde var aizņemt laiku, kas var palēnināt GC darbību.- Ieteicams izvairīties no
Finalizeizmantošanas resursu atbrīvošanai, izmantojiet vietā interfeisuIDisposableun operatoruusing. - Mūsdienu C# un .NET Framework versijās vietā, lai tieši pārdefinētu
Finalize, tiek izmantots destruktora (finalizatora) sintakse, ko kompilators pārveido parFinalizepārdefinējumu:
public class MyClassWithFinalizer
{
// Destruktors - kompilators to pārveido par `Finalize` metodi
~MyClassWithFinalizer()
{
// Kods neuzraudzītu resursu atbrīvošanai
// Piemēram: CloseHandle(myUnmanagedHandle);
System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
}
}
IDisposable izmantošana kopā ar Finalize realizē Dispose paraugu:
public class MyDisposableResource : IDisposable
{
private bool disposed = false;
// Neuzraudzīta resursa imitācija
private System.IntPtr unmanagedResource;
public MyDisposableResource()
{
// Neuzraudzīta resursa piešķiršana
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
System.Console.WriteLine("Unmanaged resource allocated.");
}
// Resursu atbrīvošanas metode
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Atbrīvot pārvaldītos resursus, ja `disposing == true`
// (šajā piemērā nav nepieciešams)
}
// Atbrīvot neuzraudzītos resursus jebkurā gadījumā
if (unmanagedResource != System.IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = System.IntPtr.Zero;
System.Console.WriteLine("Unmanaged resource freed.");
}
disposed = true;
}
}
// Iesniegums par IDisposable
public void Dispose()
{
Dispose(true);
// Aizkavē finalizatora izsaukšanu, jo resursi jau ir atbrīvoti
System.GC.SuppressFinalize(this);
}
// Finalizators (distruktors) - rezerves mehānisms neuzraudzītu resursu atbrīvošanai
~MyDisposableResource()
{
Dispose(false);
System.Console.WriteLine("Finalizer called (as a fallback).");
}
}