6
votes

Dois-je appeler graphiques.dispose ()?

dans un programme vb.net Je crée une nouvelle image bitmap, j'appelle ensuite graphiques.fromImage pour obtenir un objet graphique à dessiner sur le bitmap. L'image est ensuite affichée à l'utilisateur.

Tous les échantillons de code que j'ai vu toujours appeler .Disposez () sur des bitmaps et des objets graphiques, mais il est nécessaire de le faire lorsque vous n'avez pas appuyé de fichiers sur disque? Y a-t-il d'autres ressources non gérées que ces objets auraient pu saisir qui ne seraient pas effacés par le collecteur des ordures?


0 commentaires

5 Réponses :


1
votes

Oui, vous devriez appeler. Il n'est pas lié à toucher le disque; Il est lié à l'utilisation de ressources non gérées qui doivent être libérées correctement sur le système d'exploitation. Dans le cas de l'objet graphiques , je supposerais qu'il attribue des poignées de contexte de périphérique qui doivent être publiées lorsqu'elles ne sont plus nécessaires.


0 commentaires

6
votes

enveloppez-le dans une déclaration à l'aide de la déclaration pour la portée dans laquelle vous en avez besoin. Ensuite, ne vous inquiétez pas d'appeler explicitement appeler ()

pseudocode: xxx


0 commentaires

1
votes

La règle avec Dispose () Est-ce que si vous créez un objet Idisposable , vous êtes censé l'appeler. La meilleure façon est dans un en utilisant le bloc ou un enfin .

Ce pourrait être que vous n'avez pas besoin de le faire, mais éliminera () le décidera.

Si vous avez un objet, mais vous n'avez pas appelé le constructeur, vous devez alors vérifier la documentation de la méthode qui l'a renvoyé pour voir si elle s'attend à ce que vous appeliez () ou cela.


1 commentaires

Pour être précis, une utilisation correcte de en utilisant (voir d'autres réponses) fait implicitement disposer , de sorte que vous n'avez pas besoin de l'appeler vous-même.



6
votes

oui.

Appelez toujours Dispose () sur n'importe quel objet implémentant Idisposable . Les poignées GDI utilisées par les objets graphiques sont non gérées et nécessitent une disposition lorsque vous avez terminé avec eux.

La meilleure pratique consiste à envelopper dans un en utilisant le bloc . Il y a eu plusieurs questions sur ce sujet, BTW.


1 commentaires

Désolé si c'est un duplicata. Je n'ai rien vu de ce qui concerne ce cas particulier et était curieux de savoir ce que (le cas échéant) les ressources non gérées seraient utilisées dans ce cas.



0
votes

graphiques implémente Idisposable , donc vous devriez donc vous devriez appeler éliminer pour assurer le nettoyage des ressources non gérées.

Les ressources non gérées ne sont pas gérées par le collecteur des ordures, elles doivent donc être traitées manuellement. Ceci est typiquement fait par la méthode Dispose () afin de fournir un nettoyage à un moment défini bien défini. Il peut également être traité par un finisseur, mais dans ce cas, les ressources seront utilisées plus longtemps que nécessaire.

Le moyen le plus simple de s'assurer que l'appelé est appelé dans tous les cas consiste à utiliser l'utilisation de la construction. E.g. xxx


6 commentaires

"Ils doivent être traités manuellement" n'est pas strictement vrai car vous avez écrit un peu plus tard. Une bonne implémentation de Idisposable devrait vous assurer que vous serez en sécurité, même sans manuel (dans votre code), disposer.


@Maciejdopieralski: Je considérerais tout ce que vous devez écrire du code pour être un processus manuel. Si vous oubliez d'appeler, éliminer le nettoyage ne se produira pas. La collecte d'objets gérés en revanche se produit automatiquement.


Si vous parlez de classes propres, oui, mais tout .NET Framework Idisposable Les classes sont disposées plus tôt ou ultérieures, même si vous n'appelez pas Dispose dans votre code.


@Maciejdopieralski: Rien n'est disposé simplement en implémentant Idisposable . Vous devez appeler Disposer soit explicitement, soit via le en utilisant construction. Maintenant, si le type implémente également un finaliseur pouvant appeler disposer pour vous, mais cela ne change pas le fait que c'est quelque chose que le développeur doit gérer, ce qui le rend différent du nettoyage automatique de Mémoire gérée gérée par le GC.


Je sais tout ça. Je suppose que c'est la sémantique. Pour moi, les bibliothèques .NET et .NET Runtime ne sont que le cadre. Toutes les classes de framework standard suivent correctement Idisposable Déménagez automatiquement si je ne le fais pas par moi-même (que je sais que je devrais)


FWIW, la confusion dans le début de dessus commence par Brian ne distingue pas Que doit être fait par le concepteur d'une classe qui gère des ressources non gérées - le deuxième paragraphe "Ressources non gérées ..., De quoi Un client de cette classe doit faire - "Assurez-vous que le dispositif est appelé".