Sobes.tech
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("Ֆինալիզատոր կանչված.");
    }
}