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)
4 Réponses :
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. P>
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.). P>
Voici un article sur la manière dont le collecteur des ordures fonctionne dans .NET P>
http://www.devx.com/dotnet/article/33167 < / p>
Voici comment ms dit que le Dispose / finisseur doit être mis en œuvre: P>
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. P>
BM n'a-t-il besoin que d'être disposé à la fin, ou devrait-il être disposé avant chaque recréation? em> p>
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). P>
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.
Lors de la modification de l'image associée à un La manière appropriée de résoudre ces problèmes en général pour les classes qui ont des catégories code> iDisposables code> (comme la Imagebox CODE>, il faut appeler
Disposer code> 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 Code>. 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 Code>, il devrait être
Disposer code> d si la boîte code> 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. P>
Imagebox code>, avec
image code>) à utiliser une méthode explicite
SetImage CODE> plutôt que d'avoir une image mutable
image code>, et pour la méthode code> SetImage code> pour inclure un paramètre indiquant si le
Imagesbox < / code> devrait assumer la responsabilité de l'éliminer. Appelant
SetImage code> ou
Dispose code> sur la boîte code> doit appeler
Disposer code> sur l'image détenue si et seulement si le précédent
SetImage code> L'appel lui a donné la responsabilité. Malheureusement,
imagesbox code> 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 code> Idisposables p>
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 code> 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.