2017-02-16 45 views
0

我在想如果在下面的给定场景中,任何手动位图处理动作都需要发生。假设我的WinForm,A和B有两个Bitmaps全局图。假设我想对它们各自的图像进行一些变换/混合操作,但是想要在副本上进行。我的目标是同样调用转换功能(Bitmap Transform(Bitmap first, Bitmap second))本:C#手册-Dispose -of -an -isposable语义

var newB = Transform((Bitmap)A.Clone(), (Bitmap)B.Clone()). 

Transform做,我内变换处置AB副本?我是否在调用之前复制,然后在返回后处理?由于这些引用在Transform返回后绝对丢失,我可以相信GC吗?

-EDIT_正在添加评论FROM BELOW_-

对于可能出现的重复,我看到了那个帖子,但它缺乏使用在调用时创建的参数的任何实例。我想知道传递的对象是否在调用范围内没有家,是否有办法处置,是否需要处理,或者是否必须给予家庭以妥善处理处置。看起来好像创建一次性对象并不能在创建范围内处理这些对象,而不是从我在这里收集的内容中推荐。 -

此外,我可以证实,马丁的解决方案是有效的,虽然在转换的身体做克隆证明是最有组织和干净。只有一个克隆需要处理,因为我使用了一个作为返回中引用的对象。最后,克隆是必要的,因为任何picturebox图像刷新都会引发异常(如果图像处于读取位锁中),这是转换所必需的。感谢所有人的帮助

+0

的可能的复制[当传递到另一个物体谁应该调用Dispose IDisposable的对象?](http://stackoverflow.com/questions/4085939/who-should-call-dispose-on-idisposable-objects当传入另一个对象) – dlatikay

+0

这些位图如何在此过程中受到伤害并不明显。克隆()不能防止这种情况。但总的来说,是的,如果你是克隆(),那么你也必须处置克隆。或者当你处理A和B的时候,你会泄漏。在发布的代码中调用Dispose()中的代码是一个严重的错误,对象的所有者应该永远是显而易见的。如果你确实需要调用Clone(),那么你肯定不会做任何事情,那么它应该在Transform()中完成。然后你会使用* using *语句。 –

+0

因此,让我快速拉我的克隆动机,然后也许你可以确认它是不必要的? A和B位图正在由活动的PictureBox显示。如果我要在变换中使位图bitlock,请不要做任何更改,不要让图片框引用无效,或者至少在更改变换时更改图片框图像?在这种情况下控制刷新会被暂停吗?我想我不确定绑定的Windows Form对象与它们用于持久性GUI的任何变量有多紧密。 – schulmaster

回答

0

垃圾收集器不会自动调用DisposeIDisposable。这只会在他们的课程覆盖终结者并确保调用Dispose时才会发生。请参阅documentation here

通常最好的方法是在using块中创建一次性对象的实例。

using (var bitmapA = (Bitmap)A.Clone()) 
using (var bitmapB = (Bitmap)B.Clone()) 
{ 
    var newB = Transform(bitmapA, bitmapB); 
} 
+0

这成功地回答了我的问题,但事实证明我提出的问题可能会导致很多不良做法。仍然会接受。 – schulmaster