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.
.NETkan 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: deusing-operator roept automatisch de methodeDispose()aan bij het verlaten van het codeblok, zelfs als er een uitzondering optreedt. Dit is de voorkeursmethode voor het gebruik van objecten dieIDisposableimplementeren.
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