【问题标题】:How do I Dispose() of an image in a picture box? [duplicate]如何 Dispose() 图片框中的图像? [复制]
【发布时间】:2020-07-08 04:55:04
【问题描述】:

我的代码如下所示:

Bitmap b = new Bitmap(...); //doesn't matter how this image is constructed
pictureBox1.Image = b;
//b.Dispose() placed here crashes the application and so does "using" if used on the declaration of 'b'

由于在 C# 中您应该处置所有 IDisposable,因此需要在某个时候处置此图像。似乎属性PictureBox.Image 只制作了一个浅拷贝,所以我需要在图像停留在盒子中的整个过程中保持对象的活动状态(也就是它的Dispose())。如果我稍后更改框中的图像:

pictureBox1.Image = b2;

物业会为我处置吗?还是我应该手动操作:

Image im = pictureBox1.Image;
pictureBox1.Image = b2;
im.Dispose();

【问题讨论】:

  • "好像属性 PictureBox.Image 只做浅拷贝,"是什么让你这么想的?
  • 如果一次性模式被正确实现,没有人需要丢弃它。 Image 本身将与垃圾收集器协同工作。
  • @DStanley 因为如果它是深拷贝,当我处理 b 时,应用程序不会崩溃(查看注释行)
  • @DarkAtom 这实际上是一个引用赋值,我想它在某些方面是一个非常浅拷贝。
  • @DStanley Okok 这只是术语,我明白了 :)) 我一直认为分配 2 个引用称为浅拷贝,因为 2 将引用同一个对象。

标签: c# winforms


【解决方案1】:

是的...如果您更改 .Image 属性,您之前的图像最终将被自动丢弃。

如果您确定不再需要之前的图像,可以将其分配给临时变量,将新图像分配给您的图片框,然后处置临时变量:

Image tmp = pictureBox1.Image;
pictureBox1.Image = b2;
tmp.Dispose();

【讨论】:

  • 我怀疑这与.Image 属性有关。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2014-01-19
  • 2012-03-16
相关资源
最近更新 更多