2017-02-16 37 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