Middle
C# dilində Finalize metodu nədir?
sobes.tech Süni İntellekt
AI-dan cavab
C# dilində Finalize metodu, əsas sinif System.Object-in qorunan virtual metodudur və obyekt yaddaşdan silinməzdən əvvəl toplayıcı (GC) tərəfindən çağrılır.
Əsas məqsədi, idarə olunmayan resursları (məsələn, fayl deskriptorları, şəbəkə sobaları, idarə olunmayan yaddaş göstəriciləri) sərbəst buraxmaqdır; bunlar .NET Framework tərəfindən birbaşa idarə olunmur.
Budur Finalize haqqında bəzi əsas nöqtələr:
- Bu zəmanət edilmir ki, çağrılacaq. GC, tətbiq əvvəlcədən bitərsə, obyektin finalizasiyasını həyata keçirməyə bilər.
Finalize-in çağırılma vaxtı deterministik deyil; GC'nin nə vaxt başlayıb və metodu çağıracağını tam olaraq bilmirik.Finalize-in icrası zaman ala bilər, bu da GC-nin işini yavaşlada bilər.Finalizeistifadə etmək tövsiyə edilmir, onun yerinəIDisposableinterfeysi vəusingbəyanatından istifadə edin.- Müasir C# və .NET Framework versiyalarında, açıq şəkildə
Finalize-i yenidən yazmaq əvəzinə, destruktor (finalizator) sintaksisi istifadə olunur və tərtibçi bunuFinalize-ə çevirir:
public class MyClassWithFinalizer
{
// Destruktor - tərtibçi onu `Finalize` metoduna çevirir
~MyClassWithFinalizer()
{
// İdarə olunmayan resursların sərbəst buraxılması üçün kod
// Məsələn: CloseHandle(myUnmanagedHandle);
System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
}
}
IDisposable ilə Finalize birlikdə istifadə edilərək Dispose nümunəsi həyata keçirilir:
public class MyDisposableResource : IDisposable
{
private bool disposed = false;
// İdarə olunmayan resursun simulasyonu
private System.IntPtr unmanagedResource;
public MyDisposableResource()
{
// İdarə olunmayan resursun ayırmasının simulasyonu
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
System.Console.WriteLine("İdarə olunmayan resurs ayırıldı.");
}
// Resursları sərbəst buraxmaq üçün metod
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// `disposing == true` olsa, idarə olunan resurslar sərbəst buraxılır
// (bu nümunədə lazım deyil)
}
// Hər halda idarə olunmayan resurslar sərbəst buraxılır
if (unmanagedResource != System.IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = System.IntPtr.Zero;
System.Console.WriteLine("İdarə olunmayan resurs sərbəst buraxıldı.");
}
disposed = true;
}
}
// IDisposable tətbiqi
public void Dispose()
{
Dispose(true);
// Finalizator çağırışını ləğv et, çünki resurslar artıq sərbəst buraxılıb
System.GC.SuppressFinalize(this);
}
// Finalizator (destruktor) - idarə olunmayan resursların sərbəst buraxılması üçün ehtiyat mexanizmi
~MyDisposableResource()
{
Dispose(false);
System.Console.WriteLine("Finalizer called (as a fallback).");
}
}
Nəticədə, Finalize idarə olunmayan resursların sərbəst buraxılması üçün son şans mexanizmidir, lakin onun istifadəsi IDisposable-ə üstünlük verilməklə minimal səviyyədə saxlanmalıdır.