Sobes.tech
Middle

Wat is de interface IDisposable en waar wordt deze in C# voor gebruikt?

sobes.tech AI

Antwoord van AI

IDisposable — een interface die een mechanisme biedt voor het vrijmaken van niet-beheerde bronnen. Het bevat een methode Dispose().

Het wordt gebruikt voor:

  • Vrijmaken van niet-beheerde bronnen: zoals bestandsdescriptoren, databaseverbindingen, netwerk sockets. .NET kan deze bronnen niet automatisch beheren.
  • Opruimen na gebruik: zorgt ervoor dat resource-intensieve objecten correct worden vrijgegeven, zelfs als er uitzonderingen optreden.
  • Samen met de using-operator: de using-operator roept automatisch de methode Dispose() aan bij het verlaten van het codeblok, zelfs als er een uitzondering optreedt. Dit is de voorkeursmethode voor het gebruik van objecten die IDisposable implementeren.

Voorbeeld van implementatie:

public class MyResource : IDisposable
{
    // Simulatie van een niet-beheerde bron
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Toewijzing van een niet-beheerde bron
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `Dispose()`-methode uit de `IDisposable`-interface
    public void Dispose()
    {
        Dispose(true);
        // Finalisatie onderdrukken, omdat de bronnen al zijn vrijgegeven
        GC.SuppressFinalize(this);
    }

    // Virtuele methode voor het implementeren van de vrijgavelogica
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Vrijmaken van beheerde bronnen, indien aanwezig
                // ...
            }

            // Vrijmaken van niet-beheerde bronnen
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizer (destructor) voor het vrijmaken van bronnen als `Dispose` niet expliciet is aangeroepen
    ~MyResource()
    {
        Dispose(false);
    }
}

Voorbeeld van gebruik met using:

using (var resource = new MyResource())
{
    // Werken met de bron
    // ...
} // `Dispose()` wordt automatisch aangeroepen bij het verlaten van het `using`-blok