Middle
Тафовут байни усулҳои Dispose ва Finalize чист?
sobes.tech AI
Ҷавоб аз AI
Dispose баъси равшанан аз ҷониби таҳиягар ё муҳити иҷро (масалан, using) барои озод кардани захираҳои ғайриназоратшаванда. Finalize (бо воситаи destructor дар C#) аз ҷониби ҷамъкунандаи партовҳо ҳангоми нобуд кардани объект, агар он ба таври равшан озод нашуда бошад, даъват мешавад.
| Критерий | Dispose | Finalize (бо воситаи destructor) |
|---|---|---|
| Даъват | Равшан аз ҷониби таҳиягар (using, Dispose()) |
Автоматӣ аз ҷониби ҷамъкунандаи партовҳо |
| Вақти иҷро | Детерминатсионӣ | Недоминатсионӣ (зависит аз ҷамъкунандаи партовҳо) |
| Мақсад | Озод кардани ҳам захираҳои идорашаванда ва ҳам ғайриҳадафӣ | Озод кардани танҳо захираҳои ғайриҳадафӣ |
| Имплементация | Имплементацияи IDisposable |
Писхӯрии методи Object.Finalize (бо воситаи destructor) |
| Истифода | Роҳи афзалиятноки озод кардани захираҳо | Механизми эҳтиётӣ барои захираҳои ғайриҳадафӣ агар Dispose нарасида бошад |
Масалан барои истифодаи using (даъвати автоматии Dispose):
// Масалан барои синфе, ки `IDisposable`-ро амалӣ мекунад
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
// Кор бо файл
} // Ин ҷо автоматӣ даъват мешавад fileStream.Dispose()
Масалан барои синф бо IDisposable ва destructor:
using System;
public class MyDisposableClass : IDisposable
{
private IntPtr unmanagedResource; // Захираи ғайриҳадафӣ
private bool disposed = false;
public MyDisposableClass()
{
// Инициализатсияи захираи ғайриҳадафӣ
unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
Console.WriteLine("Захира таъин шуд.");
}
// Имплементацияи IDisposable
public void Dispose()
{
Dispose(true);
// Нотоли финализатор, зеро захира аллакай озод шудааст
GC.SuppressFinalize(this);
Console.WriteLine("Dispose() даъват шуд.");
}
// Метод ҳимояшудаи виртуалӣ барои озод кардани захираҳо
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Озод кардани захираҳои идорашаванда (агар мавҷуд бошанд)
Console.WriteLine("Озод кардани захираҳои идорашаванда.");
}
// Озод кардани захираҳои ғайриҳадафӣ
if (unmanagedResource != IntPtr.Zero)
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
unmanagedResource = IntPtr.Zero;
Console.WriteLine("Захираи ғайриҳадафӣ озод шуд.");
}
disposed = true;
}
}
// Destructor (финализатор)
~MyDisposableClass()
{
Dispose(false); // Танҳо захираҳои ғайриҳадафӣ озод мекунад
Console.WriteLine("Финализатор даъват шуд.");
}
}