Sobes.tech
Middle

IDisposable интерфейси эмне жана ал C#да эмне үчүн колдонулат?

sobes.tech AI

AIден жооп

IDisposable — бул интерфейс, ал which автоматтык түрдө башкарылбаган ресурстарды бошотуу механизмин камсыздайт. Ал бир метод Dispose() камтыйт:

Колдонуулары:

  • Бошотуу нерушимых ресурсов: Мисалы — файл дескрипторлору, базаларга байланыштар, тармак сокеттер. .NET автоматтык түрдө бул ресурстарды башкарбайт.
  • Колдонгондон кийин тазалоо: Бул ресурсту ээлеген объекттер туура бошотулушун камсыздайт, чакан ката кетсе да.
  • using оператору менен колдонуу: using оператору автоматтык түрдө Dispose() методун чакырат, код блогунан чыгуу менен, чакан ката болсо да. Бул IDisposable ишке ашырган объекттерди колдонуу үчүн эң жакшы жол.

Ишке ашыруу мисалы:

public class MyResource : IDisposable
{
    // Башкарылбаган ресурстун имитациясы
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Башкарылбаган ресурсты бөлүү
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` интерфейсинен `Dispose()` методу
    public void Dispose()
    {
        Dispose(true);
        // Финализацияны токтотуу, ресурстар алдын ала бошотулган
        GC.SuppressFinalize(this);
    }

    // Тирүү метод, бошотуу логикасы үчүн
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Башкарылуучу ресурстарды бошотуу, эгер болсо
                // ...
            }

            // Башкарылбаган ресурстарды бошотуу
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Финализация (деструктор), эгер `Dispose` чакырылбаса
    ~MyResource()
    {
        Dispose(false);
    }
}

using менен колдонуу:

using (var resource = new MyResource())
{
    // Ресурстун иштөөсү
    // ...
} // `Dispose()` автоматтык түрдө чакырылат, `using` блоктон чыкканда