Dispose və Finalize metodları arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Dispose açıq şəkildə inkişaf etdirici və ya icra mühiti (məsələn, using) tərəfindən çağırılır və idarə olunmayan resursların azad olunması üçün istifadə olunur. Finalize (C#-də destruktor vasitəsilə) isə obyekt məhv edilərkən, əgər açıq şəkildə azad edilməyibsə, toplanıcı tərəfindən çağırılır.
| Kriteriya | Dispose | Finalize (destruktor vasitəsilə) |
|---|---|---|
| Çağırış | Aydın şəkildə inkişaf etdirici tərəfindən təyin edilir (using, Dispose()) |
Avtomatik olaraq toplayıcı tərəfindən çağırılır |
| İcranın vaxtı | Deterministik | Deterministik olmayan (toplayıcının qərarına bağlı) |
| Təyinatı | İdarə olunan və idarə olunmayan resursların azad edilməsi | Yalnız idarə olunmayan resursların azad edilməsi |
| Tətbiqi | IDisposable interfeysinin tətbiqi |
Object.Finalize metodunun override edilməsi (destruktor sintaksisi ilə) |
| İstifadəsi | Resursların azad olunması üçün üstün üsul | İdarə olunmayan resurslar üçün ehtiyat mexanizmi |
using istifadə nümunəsi (avtomatik Dispose çağırışı):
// IDisposable tətbiq edən sinif nümunəsi
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
// Fayl ilə işləmə
} // Burada avtomatik olaraq fileStream.Dispose() çağırılır
IDisposable və destruktor ilə sinif nümunəsi:
using System;
public class MyDisposableClass : IDisposable
{
private IntPtr unmanagedResource; // İdarə olunmayan resursu təmsil edir
private bool disposed = false;
public MyDisposableClass()
{
// İdarə olunmayan resursun ilkinləşdirilməsi
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
Console.WriteLine("Resurs ayrıldı.");
}
// IDisposable tətbiqi
public void Dispose()
{
Dispose(true);
// Finalizasiyanı ləğv et, çünki resurs artıq azad olunub
GC.SuppressFinalize(this);
Console.WriteLine("Dispose() çağırıldı.");
}
// Resursların azad olunması üçün qorunan virtual metod
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// İdarə olunan resursların azad olunması (əgər varsa)
Console.WriteLine("İdarə olunan resursların azad olunması.");
}
// İdarə olunmayan resursların azad olunması
if (unmanagedResource != IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = IntPtr.Zero;
Console.WriteLine("İdarə olunmayan resurs azad edildi.");
}
disposed = true;
}
}
// Destruktor (finalizator)
~MyDisposableClass()
{
Dispose(false); // Yalnız idarə olunmayan resursları azad edir
Console.WriteLine("Finalizator çağırıldı.");
}
}
Dispose metodu, idarə olunmayan resursları idarə edən bütün siniflər üçün tətbiq olunmalıdır (fayllar, şəbəkə əlaqələri, deskriptorlar və s.). Finalize isə Dispose çağırılmadıqda idarə olunmayan resursların ehtiyat olaraq azad olunması üçün istifadə olunur. Finalize-ı tətbiq edən siniflər Dispose(true) daxilində onun çağırılmasını ləğv etməlidir ki, resursların iki dəfə azad olunmasının qarşısı alınsın.