Utilisation correcte de l’interface IDisposable
Source : Stack Overflow [.net]
L’objectif de Dispose est de libérer les ressources non managées. Cela doit être fait à un moment donné, sinon elles ne seront jamais nettoyées. Le ramasse-miettes ne sait pas comment appeler DeleteHandle() sur une variable de type IntPtr, il ne sait pas si il a besoin d’appeler DeleteHandle() ou non.
Remarque : Qu’est-ce qu’une ressource non managée ? Si vous l’avez trouvée dans le Microsoft .NET Framework : elle est managée. Si vous avez fouillé vous-même dans MSDN, elle est non managée. Tout ce que vous avez utilisé via des appels P/Invoke pour sortir du monde douillet de tout ce qui est disponible dans le .NET Framework est non managé – et vous êtes désormais responsable de son nettoyage.
L’objet que vous avez créé doit exposer une méthode que le monde extérieur peut appeler pour nettoyer les ressources non managées. La méthode peut être nommée comme vous le souhaitez :
public void Cleanup()
ou
public void Shutdown()
Mais il existe un nom standardisé pour cette méthode :
public void Dispose()
Une interface a même été créée, IDisposable, qui ne contient que cette seule méthode :
public interface IDisposable
{
void Dispose();
}
Vous faites donc en sorte que votre objet expose l’interface IDisposable, et de cette manière vous promettez que vous avez écrit cette unique méthode pour nettoyer vos ressources non managées :
public void Dispose()
{
Win32.DestroyHandle(this.CursorFileBitmapIconServiceHandle);
}
Et c’est terminé.
Sauf que vous pouvez faire mieux
Que se passe-t-il si votre objet a alloué un System.Drawing.Bitmap de 250 Mo (c’est-à-dire la classe Bitmap managée .NET) comme une sorte de tampon d’image ? Bien sûr, c’est un objet managé .NET, et le ramasse-miettes le libérera. Mais voulez-vous vraiment laisser 250 Mo de mémoire inutilisée – en attendant que le ramasse-miettes finisse par passer et la libérer ? Et s’il y a une connexion de base de données ouverte
(Réponse tronquée)