Sobes.tech
Middle

რა არის ინტერფეისი IDisposable და რა მიზნით გამოიყენება C#-ში?

sobes.tech AI

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

IDisposable — бу интерфейс, идарә ителмәгән ресурсларны азат итү механизмын тәэмин итә. Ул бер метод 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()` автомат рәвештә чакырыла