Middle
Ի՞նչ է Dispose և Finalize մեթոդների տարբերությունը։
sobes.tech AI
Պատասխան AI-ից
Dispose կոչվում է բացահայտորեն ծրագրավորողի կամ գործարկման միջավայրի կողմից (օրինակ, using)՝ անջատելու համար կառավարելի և ոչ կառավարելի ռեսուրսները։ Finalize (C#-ում դեստրուկտորով) կոչվում է գույքագրման հավաքիչի կողմից օբյեկտի ոչնչացման ժամանակ, եթե այն չի եղել բացահայտորեն ազատված։
| Կատեգորիա | Dispose | Finalize (դեստրուկտորով) |
|---|---|---|
| Հրավիրում | Բացահայտորեն ծրագրավորողի կողմից (using, Dispose()) |
Ավտոմատ կերպով գույքագրման հավաքիչի կողմից |
| Անցկացման ժամանակ | Դետերմինիստիկ | Նեդետերմինիստիկ (կախված գույքագրման հավաքչից) |
| Նպատակը | Կառավարվող և ոչ կառավարվող ռեսուրսների ազատում | Միայն ոչ կառավարվող ռեսուրսների ազատում |
| Իմպլեմենտացիա | IDisposable ինտերֆեյսի իրականացում |
Object.Finalize մեթոդի վերագրում (դեստրուկտորով) |
| Օգտագործում | Առաջընթաց միջոց ռեսուրսների ազատման համար | Ապահով միջոց ոչ կառավարվող ռեսուրսների համար, եթե Dispose չի կանչվել |
Օրինակ using օգտագործման (ավտոմատ Dispose կանչով):
// Օրինակ `IDisposable` իրականցնող դասի
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
// Ֆայլի հետ աշխատանք
} // Այստեղ ավտոմատ կերպով կանչվում է fileStream.Dispose()
Օրինակ IDisposable և դեստրուկտորով դասի:
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;
}
}
// Դեստրուկտոր (ֆինալիզատոր)
~MyDisposableClass()
{
Dispose(false); // Միայն անկառավարելի ռեսուրսները ազատում է
Console.WriteLine("Ֆինալիզատոր կանչված.");
}
}