Sobes.tech
Middle

Ի՞նչ է IDisposable ինտերֆեյսը և ինչու է այն օգտագործվում C#-ում։

sobes.tech AI

Պատասխան AI-ից

IDisposable — դա ինտերֆեյս է, որը տրամադրում է անջատվող ռեսուրսների ազատման մեխանիզմ: Այն պարունակում է մեկ մեթոդ Dispose():

Օգտագործվում է՝

  • Անջատվող ռեսուրսների ազատում: Օրինակ՝ ֆայլային դեսկրիպտորներ, տվյալների բազաների կապեր, ցանցային սոկետներ: .NET-ը չի կարող ավտոմատ կերպով կառավարել այս ռեսուրսները:
  • Օգտագործումից հետո մաքրման: Գаранտիա է տալիս, որ ռեսուրսային ծանր օբյեկտները ճիշտ ազատված կլինեն, նույնիսկ եթե տեղի ունենան արտառոց իրավիճակներ:
  • Օգտագործման հետ using օպերատորով: using օպերատորը ավտոմատ կերպով կանչում է Dispose() մեթոդը կոդի բլոկի ավարտին, նույնիսկ եթե տեղի ունենան արտառոց իրավիճակներ:

Նմուշ՝ իրականացման:

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` բլոկից