![](/img/trans.png)
[英]How and where should i dispose the old image ? And to what size to set the image in the pictureBox as minimum and maximum?
[英]If I replace an image in a PictureBox control, should I dispose the original image first? .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
或给出另一个图像时将其设置为Dispose
d。 如果图像应该被共享或重用,则这些条件不得导致它被丢弃。
一般来说,解决此类问题的正确方法是,具有IDisposable
属性的类(如PictureBox
,带有Image
)使用显式SetImage
方法而不是具有可变Image
属性,并且SetImage
方法包含一个参数,指示是否PictureBox
应负责处理它。 当且仅当前一个SetImage
调用给它负责时,在PictureBox
上调用SetImage
或Dispose
应该在保持的图像上调用Dispose
。 不幸的是, PictureBox
不能这样工作,但我强烈建议将其用作您编写的包含IDisposable
对象的未来类的模式。
是的你应该。 它实现了IDisposable。
根据一般经验法则,处置实现IDisposable的所有对象。 不要把它留给GC。
bm只需要在最后处置,还是应该在每次重新创建之前处理?
它应该在每次“娱乐”之前处理。 不要将对象与对象引用混淆。 “new Bitmap”创建一个新对象。 “bm”是恰好指向该对象的引用。 他们不一样。 您不是在这里“重新创建”任何对象 - 您正在创建一个新对象,然后删除对前一个对象的所有引用,这意味着我将在(近)未来的某个时间进行垃圾回收。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.