如果我替换PictureBox控件中的图像,我应该先处理原始图像吗? .Net Winforms

继我的问题之后,如果我更换图片框中的图像,我应该首先处理原始图像吗?

或者,这种情况怎么样:

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

bm只需要在最后处理,还是应该在每次重新创建之前处理?


谢谢大家的答案。 在我身上有一个很大的疏忽。 我知道一个控制部门负责处理它的孩子,但我没想到如果我更换它就应该处理一个旧图像。

是的,您应该在同一变量之上创建新图像之前处置旧对象。 通过使用相同变量创建新图像,您将删除对它的引用。 如果没有对旧对象的引用,则表示它应该由GC(垃圾收集器)拾取。 虽然从技术上讲,这“应该”最终导致内存被释放,假设终结器确保非托管资源得到处理,这是一个很大的假设(你甚至不能假设将调用终结器) ,它会为系统带来更多的工作。 非默认终结器在垃圾收集级别提升方面导致GC的额外工作,导致需要更长时间来释放内存,以及GC必须运行的次数。

这是假设所有写入都是为了确保终结器处理它。 只要一个对象有一个Dispose方法(任何实现BitMap所做的IDisposable),就应该在删除对象的引用之前调用它(超出范围,删除对象的引用等)。

这是一篇关于垃圾收集器如何在.net中工作的文章

http://www.devx.com/dotnet/Article/33167

以下是MS如何实施dispose / finalizer:

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

当更改与PictureBox关联的图像时,应该在当时的图像上调用Dispose ,并且仅当其他任何内容都不会使用该图像时。 为了知道这一点,人们必须知道旧图像来自何处。 在某些情况下,创建图像只是为了分配给PictureBox 。 在其他情况下,图像可以是旨在共享和/或重用的图像。 如果图像仅为分配给PictureBox而创建,则应该在Dispose PictureBox或给出另一个图像时处理。 如果图像应该被共享或重用,则这些条件不得导致它被丢弃。

解决此类问题的正确方法一般是对具有IDisposable属性的类(如PictureBox ,使用Image )使用显式SetImage方法而不是具有可变Image属性,并且对于SetImage方法包含指示是否PictureBox应负责处理它。 当且仅当前一个SetImage调用给它负责时,在PictureBox上调用SetImageDispose应该在保持的图像上调用Dispose 。 不幸的是, PictureBox不能这样工作,但我强烈建议将其用作您编写的包含IDisposable对象的未来类的模式。

是的你应该。 它实现了IDisposable。
根据一般经验法则,处置实现IDisposable的所有对象。 不要将它留给GC。

bm只需要在最后处理,还是应该在每次重新创建之前处理?

它应该在每次“娱乐”之前处理。 不要将对象与对象引用混淆。 “new Bitmap”创建一个新对象。 “bm”是恰好指向该对象的引用。 他们不一样。 您不是在这里“重新创建”任何对象 – 您正在创建一个新对象,然后删除对前一个对象的所有引用,这意味着我将在(近)未来的某个时间进行垃圾回收。