如果我替换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:
当更改与PictureBox
关联的图像时,应该在当时的图像上调用Dispose
,并且仅当其他任何内容都不会使用该图像时。 为了知道这一点,人们必须知道旧图像来自何处。 在某些情况下,创建图像只是为了分配给PictureBox
。 在其他情况下,图像可以是旨在共享和/或重用的图像。 如果图像仅为分配给PictureBox
而创建,则应该在Dispose
PictureBox
或给出另一个图像时处理。 如果图像应该被共享或重用,则这些条件不得导致它被丢弃。
解决此类问题的正确方法一般是对具有IDisposable
属性的类(如PictureBox
,使用Image
)使用显式SetImage
方法而不是具有可变Image
属性,并且对于SetImage
方法包含指示是否PictureBox
应负责处理它。 当且仅当前一个SetImage
调用给它负责时,在PictureBox
上调用SetImage
或Dispose
应该在保持的图像上调用Dispose
。 不幸的是, PictureBox
不能这样工作,但我强烈建议将其用作您编写的包含IDisposable
对象的未来类的模式。
是的你应该。 它实现了IDisposable。
根据一般经验法则,处置实现IDisposable的所有对象。 不要将它留给GC。
bm只需要在最后处理,还是应该在每次重新创建之前处理?
它应该在每次“娱乐”之前处理。 不要将对象与对象引用混淆。 “new Bitmap”创建一个新对象。 “bm”是恰好指向该对象的引用。 他们不一样。 您不是在这里“重新创建”任何对象 – 您正在创建一个新对象,然后删除对前一个对象的所有引用,这意味着我将在(近)未来的某个时间进行垃圾回收。