7
votes

Si je remplace une image dans une commande de photobox, devrais-je en disposer l'image d'origine en premier?

Suivre de Ma question ici , si je remplace une image dans une zone d'image, devrais-je disposer d'abord l'image d'origine?

ou, qu'en est-il de cette situation: p>

Dim bm As New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  


0 commentaires

4 Réponses :


5
votes

Oui, vous devez disposer de l'ancien objet avant de créer une nouvelle image en haut de la même variable. En créant une nouvelle image avec la même variable, vous enlevez une référence à celle-ci. S'il n'y a pas de références à l'ancien objet, vous indiquez qu'il devrait être ramassé par la GC (collecteur de déchets). Bien que techniquement, cela "devrait" entraîner une libération de la mémoire en supposant que le finalisateur veille à ce que les ressources non gérées soient soignées, c'est une hypothèse importante (vous ne pouvez même pas vraiment supposer que le finaliseur sera appelé) , et cela provoque plus de travail pour le système. Les finaliseurs non par défaut provoquent des travaux supplémentaires pour le GC en termes de promotion de niveau de collecte des ordures, entraînant la prise de plus que la mémoire soit traitée, et le nombre de fois que le GC doit fonctionner pour le faire.

Cela suppose que tout est écrit pour vous assurer que le finaliseur la gère. À tout moment, un objet dispose d'une méthode d'élimination (tout ce qui implémente Idisposable quel bitmap fait), il convient d'appeler avant de retirer la référence à l'objet (tomber hors de portée, en supprimant la référence à l'objet, etc.).

Voici un article sur la manière dont le collecteur des ordures fonctionne dans .NET

http://www.devx.com/dotnet/article/33167 < / p>

Voici comment ms dit que le Dispose / finisseur doit être mis en œuvre:

http://msdn.microsoft.com/en-us/library/ b1yfkh5e.aspx


0 commentaires

2
votes

Oui, vous devriez. Il implémente Idisposable.
En règle générale, disposez de tous les objets qui implémentent Idisposable. Ne laissez pas le gc.


0 commentaires

2
votes

BM n'a-t-il besoin que d'être disposé à la fin, ou devrait-il être disposé avant chaque recréation?

Il devrait être disposé avant chaque "récréation". Ne confondez pas un objet avec une référence d'objet. "Nouveau bitmap" crée un nouvel objet. "BM" est une référence qui arrive à pointer vers cet objet. Ils ne sont pas les mêmes. Vous n'êtes pas "recréer" n'importe quel objet ici - Vous créez un nouvel objet, puis déposez toutes les références à l'objet précédent, ce qui signifie que je serai des ordures collectées un peu de temps dans l'avenir (proche).


1 commentaires

Merci d'avoir refusé cela pour moi. Je suis au courant de tous les concepts de votre réponse, mais quelques jours, j'ai un gel du cerveau! Avez-vous déjà oublié comment épeler un mot court? C'est ce que ça fait.



3
votes

Lors de la modification de l'image associée à un Imagebox , il faut appeler Disposer sur l'image qui était là si et seulement si rien d'autre ne va jamais utiliser cette image. Afin de savoir que, il faudrait savoir où vient l'ancienne image. Dans certains cas, l'image aura été créée uniquement dans le but d'être affectée au Imagebox . Dans d'autres cas, l'image peut être celle qui est destinée à être partagée et / ou réutilisée. Si l'image a été créée uniquement à des fins d'affectation au Imagebox , il devrait être Disposer d si la boîte est disposée ou donnée une autre image. Si l'image est censée être partagée ou réutilisée, de telles conditions ne doivent pas le faire disposer.

La manière appropriée de résoudre ces problèmes en général pour les classes qui ont des catégories iDisposables (comme la Imagebox , avec image ) à utiliser une méthode explicite SetImage plutôt que d'avoir une image mutable image , et pour la méthode SetImage pour inclure un paramètre indiquant si le Imagesbox < / code> devrait assumer la responsabilité de l'éliminer. Appelant SetImage ou Dispose sur la boîte doit appeler Disposer sur l'image détenue si et seulement si le précédent SetImage L'appel lui a donné la responsabilité. Malheureusement, imagesbox ne fonctionne pas de cette façon, mais je vous recommande vivement d'utiliser cela comme un motif pour les cours futurs que vous écrivez quels sont les objets Idisposables


2 commentaires

C'est la seule réponse à la question de la première partie de la question, sur la question de savoir si l'image imagebox avant d'attribuer.


@Uwekeim: Je pensais que c'était une question importante qui aucune des autres réponses n'a été touchée. Heureux que vous ayez trouvé ma réponse utile. Je soupçonne que le Cadre a été écrit avant que les gens ont réellement compris à quel point l'Idisposable allait travailler, et ces anciennes classes sont placées en pierre, mais aucune raison ne fait que les classes plus récentes devraient répéter les anciennes erreurs.