Middle
Qu'est-ce que l'interface IDisposable et à quoi sert-elle en C#?
sobes.tech IA
Réponse de l'IA
IDisposable — c'est une interface qui fournit un mécanisme pour libérer des ressources non gérées. Elle contient une méthode Dispose().
Elle est utilisée pour :
- Libérer des ressources non gérées : telles que des descripteurs de fichiers, des connexions à des bases de données, des sockets réseau.
.NETne peut pas gérer automatiquement ces ressources. - Nettoyage après utilisation : garantit que les objets gourmands en ressources sont correctement libérés, même en cas d'exception.
- Utilisation avec l'opérateur
using: l'opérateurusingappelle automatiquement la méthodeDispose()à la fin du bloc de code, même si une exception se produit. C'est la façon préférée d'utiliser des objets qui implémententIDisposable.
Exemple d'implémentation :
public class MyResource : IDisposable
{
// Simulation d'une ressource non gérée
private bool isDisposed = false;
private IntPtr unmanagedPointer;
public MyResource()
{
// Allocation d'une ressource non gérée
unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
}
// Méthode Dispose de l'interface IDisposable
public void Dispose()
{
Dispose(true);
// Annuler la finalisation, car les ressources sont déjà libérées
GC.SuppressFinalize(this);
}
// Méthode virtuelle pour implémenter la logique de libération
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Libérer les ressources gérées, si elles existent
// ...
}
// Libérer les ressources non gérées
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
unmanagedPointer = IntPtr.Zero;
isDisposed = true;
}
}
// Finaliseur (destructeur) pour libérer les ressources si Dispose n'a pas été appelé explicitement
~MyResource()
{
Dispose(false);
}
}
Exemple d'utilisation avec using :
using (var resource = new MyResource())
{
// Travail avec la ressource
// ...
} // Dispose() est appelé automatiquement à la sortie du bloc using