J’apprends à dessiner des choses en C # et je continue à voir des recommandations pour utiliser la méthode dispose (), mais je ne comprends pas très bien ce que ça fait.
IDisposable
, vous devez appeler Dispose
juste avant qu’il ne devienne éligible pour le garbage collection. Comme d’autres l’ont fait remarquer, il est préférable d’utiliser l’instruction using
plutôt que d’appeler directement Dispose
. StreamWriter
). Pour cette raison, il est préférable de toujours disposer de toute classe qui implémente IDisposable
, en règle générale. Dispose
avant que vous n’ayez terminé avec l’object, puis tentez d’utiliser l’object supprimé, vous obtiendrez une ObjectDisposedException
. Lorsque vous demandez un object graphique, Windows allouera un peu de mémoire pour vous. L’appel de disposition va nettoyer cette mémoire pour vous. Si vous n’appelez pas éliminé, toutes ces poignées restront en mémoire et votre système manquera de ressources, deviendra plus lent et finira par s’arrêter (la fermeture du programme peut toutefois les libérer).
Parce que vous utilisez .NET, lorsque vous avez fini d’utiliser votre object graphique, le ramasse-miettes appellera éventuellement dispose pour vous. Le problème avec le ramasse-miettes est que vous ne savez jamais quand il va nettoyer l’object, il peut donc laisser ces ressources ouvertes plus longtemps que nécessaire.
Ceci dit, vous ne devriez jamais avoir à appeler vous-même. Mieux vaut mettre votre object en utilisant scope:
using(Graphics g) { // do something with the resource }
Désormais, lorsque vous quittez cette utilisation avec l’object, l’object sera détruit et dispose sera appelé automatiquement pour vous. Vous devez placer tous les objects pour lesquels la méthode dispose est définie dans une étendue using.
En clair, Dispose () concerne le nettoyage après l’utilisation d’une ressource non gérée.
Qu’est-ce qu’une ressource non gérée? C’est tout ce que le CLR ne gère pas pour vous. Ce sont des manipulations de fichiers, des connexions à une firebase database, des sockets réseau, des stylos GDI +, etc. Vous pouvez accéder à ces objects via un object .NET typique, mais il implémentera IDisposable pour vous permettre de nettoyer correctement.
Pourquoi nettoyer? Tant que vous n’avez pas nettoyé la situation, cette ressource n’est pas disponible pour d’autres parties du programme. À cet égard, vous cassez des choses, parce que vous monopolisez une ressource.
Pourquoi fais-tu cela toi-même? Vous devez le faire vous-même dès que vous cessez d’utiliser la ressource, plutôt que de vous fier à la magie automatique du ramasse-miettes, car cela pourrait prendre un certain temps (bien, non spécifié) avant que le ramasse-miettes ne l’ait atteint. Tant qu’un object n’a pas été éliminé correctement, vous ne pouvez pas réutiliser la ressource sous-jacente. Votre programme ne fonctionnera donc pas de manière fiable.
Mitch Wheat dit – Appelez toujours Dispose () sur tout object implémentant IDisposable. Les descripteurs GDI utilisés par les objects graphiques ne sont pas gérés et doivent être éliminés lorsque vous avez terminé.