Middle
Методи Finalize дар C# чист?
sobes.tech AI
Ҷавоб аз AI
Метод Finalize дар C# — это муҳофизатшудаи виртуалӣ дар асоси System.Object, ки аз ҷониби ҷамъкунандаи партовҳо (GC) бевосита пеш аз он ки объект аз ёддошт хориҷ шавад, даъват мешавад.
Мақсади асосии он озод кардани захираҳои ғайриҳуқуқӣ (масалан, дескрипторҳои файлҳо, сокуҳои шабакавӣ, ишораҳо ба ёддоштҳои ғайриҳуқуқӣ), ки мустақиман аз ҷониби .NET Framework назорат намешаванд.
Инҷо чанд нуқтаи калидӣ дар бораи Finalize:
- Гарантӣ нест, ки даъват мешавад. GC метавонад финализатсияи объектро гузарад, агар барнома пештар ба итмом расад.
- Вақти даъвати
Finalizeдетерминистикӣ нест. Мо наметавонем дақиқ бидонем, кай GC оғоз мешавад ва методро даъват мекунад. - иҷрои
Finalizeметавонад вақт бигирад, ки метавонад кори GC-ро суст кунад. - Тавсия дода мешавад, ки истифодаи
Finalizeбарои озод кардани захираҳо кам карда шавад, ва ба ҷои он интерфейсиIDisposableва операториusingистифода шавад. - Дар версияҳои муосири C# ва .NET Framework, ба ҷои иваз кардани
Finalizeба таври ошкор, синтаксиси деструктор (финализатор) истифода мешавад, ки компилятор онро ба иваз карданиFinalizeтабдил медиҳад:
public class MyClassWithFinalizer
{
// Деструктор — компилятор онро ба методи Finalize табдил медиҳад
~MyClassWithFinalizer()
{
// Код барои озод кардани захираҳои ғайриҳуқуқӣ
// Масалан: CloseHandle(myUnmanagedHandle);
System.Console.WriteLine("Finalizer called for MyClassWithFinalizer");
}
}
Истифодаи IDisposable дар якҷоягӣ бо Finalize паттерни Dispose-ро амалӣ мекунад:
public class MyDisposableResource : IDisposable
{
private bool disposed = false;
// Имитацияи захираи ғайриҳуқуқӣ
private System.IntPtr unmanagedResource;
public MyDisposableResource()
{
// Имитацияи тақсимоти захираи ғайриҳуқуқӣ
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
System.Console.WriteLine("Unmanaged resource allocated.");
}
// Методи озод кардани захираҳо
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Озод кардани захираҳои идорашаванда, агар disposing == true
// (дар ин намуна зарурат нест)
}
// Озод кардани захираҳои ғайриҳуқуқӣ дар ҳар ҳолат
if (unmanagedResource != System.IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = System.IntPtr.Zero;
System.Console.WriteLine("Unmanaged resource freed.");
}
disposed = true;
}
}
// Иҷрои IDisposable
public void Dispose()
{
Dispose(true);
// Тамъам кардани даъвати финализатор, зеро захираҳо аллакай озод шудаанд
System.GC.SuppressFinalize(this);
}
// Финализатор (деструктор) — механизм барои озод кардани захираҳои ғайриҳуқуқӣ
~MyDisposableResource()
{
Dispose(false);
System.Console.WriteLine("Finalizer called (as a fallback).");
}
}
Бинобар ин, Finalize механизмест барои охирин имконият озод кардани захираҳои ғайриҳуқуқӣ, аммо истифодаи он бояд кам карда шавад дар фоидаи IDisposable.