Sobes.tech
Middle

Dispose va Finalize usullari orasidagi farq nima?

sobes.tech AI

AIdan javob

Dispose chaqiradi aniq ravishda ishlab chiquvchi yoki bajaruvchi muhit (masalan, using) tomonidan boshqarilmagan resurslarni ozod qilish uchun. Finalize (C# da destruktor orqali) garbage collector tomonidan ob'ekt o'ldirilganda chaqiriladi, agar u aniq ravishda ozod qilinmagan bo'lsa.

Mezon Dispose Finalize (destruktor orqali)
Chaqirilishi Aniq ravishda ishlab chiquvchi tomonidan (using, Dispose()) Avtomatik ravishda garbage collector tomonidan
Ish vaqti Aniq (deterministik) Noaniq (garbage collectorga bog'liq)
Ma'nosi Boshqariladigan va boshqarilmaydigan resurslarni ozod qilish Faqat boshqarilmaydigan resurslarni ozod qilish
Implementatsiya IDisposable interfeysi bilan Object.Finalize metodini override qilish (destruktor orqali)
Foydalanish Resurslarni ozod qilish uchun afzal usul Boshqarilmaydigan resurslar uchun zaxira mexanizmi

using dan foydalanish misoli (avtomatik Dispose chaqirishi):

// `IDisposable` ni amalga oshirgan sinfdan foydalanish misoli
using (var fileStream = new System.IO.FileStream("myfile.txt", System.IO.FileMode.Open))
{
    // Fayl bilan ishlash
} // Bu yerda fileStream.Dispose() avtomatik chaqiriladi

IDisposable va destruktor bilan sinf misoli:

using System;

public class MyDisposableClass : IDisposable
{
    private IntPtr unmanagedResource; // Boshqarilmaydigan resurs
    private bool disposed = false;

    public MyDisposableClass()
    {
        // Boshqarilmaydigan resursni boshlash
        unmanagedResource = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
        Console.WriteLine("Resurs ajratildi.");
    }

    // `IDisposable` ni amalga oshirish
    public void Dispose()
    {
        Dispose(true);
        // Finalizatsiyani to'xtatish, chunki resurs allaqachon ozod qilindi
        GC.SuppressFinalize(this);
        Console.WriteLine("Dispose() chaqirildi.");
    }

    // Resurslarni ozod qilish uchun himoyalangan virtual metod
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Boshqariladigan resurslarni ozod qilish (agar mavjud bo'lsa)
                Console.WriteLine("Boshqariladigan resurslar ozod qilindi.");
            }

            // Boshqarilmaydigan resurslarni ozod qilish
            if (unmanagedResource != IntPtr.Zero)
            {
                System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedResource);
                unmanagedResource = IntPtr.Zero;
                Console.WriteLine("Boshqarilmaydigan resurs ozod qilindi.");
            }

            disposed = true;
        }
    }

    // Destruktor (finalizer)
    ~MyDisposableClass()
    {
        Dispose(false); // Faqat boshqarilmaydigan resurslarni ozod qilish
        Console.WriteLine("Finalizer chaqirildi.");
    }
}

Dispose metodi barcha boshqarilmaydigan resurslarni boshqaradigan sinflarda amalga oshirilishi kerak (fayllar, tarmoq ulanishlari, deskriptorlar va boshqalar). Finalize uni chaqirilmagan hollarda boshqarilmaydigan resurslarni ozod qilish uchun zaxira mexanizmi sifatida ishlatilishi kerak. Finalize ni Dispose(true) ichida to'xtatish, resurslarni ikki marta ozod qilishdan saqlash uchun muhimdir.