我在想如果在下面的给定场景中,任何手动位图处理动作都需要发生。假设我的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
做,我内变换处置A
和B
副本?我是否在调用之前复制,然后在返回后处理?由于这些引用在Transform
返回后绝对丢失,我可以相信GC吗?
-EDIT_正在添加评论FROM BELOW_-
对于可能出现的重复,我看到了那个帖子,但它缺乏使用在调用时创建的参数的任何实例。我想知道传递的对象是否在调用范围内没有家,是否有办法处置,是否需要处理,或者是否必须给予家庭以妥善处理处置。看起来好像创建一次性对象并不能在创建范围内处理这些对象,而不是从我在这里收集的内容中推荐。 -
此外,我可以证实,马丁的解决方案是有效的,虽然在转换的身体做克隆证明是最有组织和干净。只有一个克隆需要处理,因为我使用了一个作为返回中引用的对象。最后,克隆是必要的,因为任何picturebox图像刷新都会引发异常(如果图像处于读取位锁中),这是转换所必需的。感谢所有人的帮助
的可能的复制[当传递到另一个物体谁应该调用Dispose IDisposable的对象?](http://stackoverflow.com/questions/4085939/who-should-call-dispose-on-idisposable-objects当传入另一个对象) – dlatikay
这些位图如何在此过程中受到伤害并不明显。克隆()不能防止这种情况。但总的来说,是的,如果你是克隆(),那么你也必须处置克隆。或者当你处理A和B的时候,你会泄漏。在发布的代码中调用Dispose()中的代码是一个严重的错误,对象的所有者应该永远是显而易见的。如果你确实需要调用Clone(),那么你肯定不会做任何事情,那么它应该在Transform()中完成。然后你会使用* using *语句。 –
因此,让我快速拉我的克隆动机,然后也许你可以确认它是不必要的? A和B位图正在由活动的PictureBox显示。如果我要在变换中使位图bitlock,请不要做任何更改,不要让图片框引用无效,或者至少在更改变换时更改图片框图像?在这种情况下控制刷新会被暂停吗?我想我不确定绑定的Windows Form对象与它们用于持久性GUI的任何变量有多紧密。 – schulmaster