Sobes.tech
Middle

რა განსხვავებაა Dispose და Finalize მეთოდებს შორის?

sobes.tech AI

პასუხი AI-სგან

Dispose მოწოდებულია მკაფიოდ დეველოპერის ან გარემოს მიერ (მაგალითად, using) არასამართლებრივი რესურსების განთავისუფლებისთვის. Finalize (C#-ში დესტრუქტორის საშუალებით) იძახება მტვრის შეგროვებლის მიერ ობიექტის განადგურებისას, თუ ის არ იყო მკაფიოდ განთავისუფლებული.

კრიტერიუმი Dispose Finalize (დესტრუქტორის საშუალებით)
კითხვა მკაფიოდ დეველოპერის მიერ მითითებული (using, Dispose()) ავტომატურად იძახება მტვრის შეგროვებლის მიერ
შესრულების დრო დეტერმინირებული დეიტერმინირებული (მტვრის შეგროვებლის დამოკიდებული)
მიზანი მართვადი და მართვადი რესურსების განთავისუფლება მხოლოდ მართვადი რესურსების განთავისუფლება
რეალიზაცია IDisposable ინტერფეისი Object.Finalize მეთოდის გადამუშავება (დესტრუქტორის სინტაქსით)
გამოყენება რესურსების განთავისუფლების უპირატესად გამოყენებული მეთოდი არასამართლებრივი რესურსების გადამრჩენელი მექანიზმი

მაგალითი 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("ფინალიზატორი მოწოდებულია.");
    }
}

Dispose მეთოდი უნდა იყოს რეალიზებული ყველა კლასისთვის, რომელიც მართავს არასამართლებრივ რესურსებს (ფაილები, ქსელური კავშირები, დესკრიპტორები და ა.შ.). Finalize უნდა გამოიყენოს როგორც გადაუდებელი ვარიანტი არასამართლებრივი რესურსების განთავისუფლებისთვის, თუ Dispose არ იყო მოწოდებული. კლასები, რომლებიც რეალიზებენ Finalize, უნდა გამორთონ მისი მოწოდება Dispose(true)-ში, რათა თავიდან აიცილონ რესურსების ორჯერ განთავისუფლება.