Quand dois-je utiliser dispose () sur les graphiques?

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.

  • Quand devrais-je utiliser dispose () sur un graphique dessiné en code?
  • Que se passe-t-il si je ne le fais pas?
  • Dois-je l’appeler chaque fois qu’un graphique n’est pas visible, par exemple sur une interface graphique comportant des tabs et que l’utilisateur passe à l’autre onglet, puis le redessine lorsqu’il revient?
  • Vais-je casser des choses si j’appelle quand je ne devrais pas?
  • Batman va-t-il échapper aux griffes maléfiques du Joker?

  • Quand devrais-je utiliser dispose () sur un graphique dessiné en code? Chaque fois que vous en avez terminé avec un object implémentant 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 .
  • Que se passe-t-il si je ne le fais pas? Votre programme sera légèrement moins efficace car il nécessitera un peu plus de ressources que nécessaire. C’est le seul inconvénient à ne pas disposer de graphiques; Cependant, le fait de ne pas supprimer d’autres classes peut en réalité causer des erreurs (par exemple, 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.
  • Dois-je l’appeler chaque fois qu’un graphique n’est pas visible, par exemple sur une interface utilisateur graphique comportant des tabs et que l’utilisateur passe à l’autre onglet, puis le redessine lorsqu’il revient? Les objects ne doivent être éliminés que lorsque vous en avez complètement terminé.
  • Vais-je casser des choses si j’appelle quand je ne devrais pas? Oui. Si vous appelez Dispose avant que vous n’ayez terminé avec l’object, puis tentez d’utiliser l’object supprimé, vous obtiendrez une ObjectDisposedException .
  • Batman va-t-il échapper aux griffes maléfiques du Joker? Accordez demain, même bat-time, même bat-channel!

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é.