簡體   English   中英

如果我替換PictureBox控件中的圖像,我應該首先處理原始圖像嗎? .Net Winforms

[英]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:

http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

當更改與PictureBox關聯的圖像時,應該在當時的圖像上調用Dispose ,並且僅當沒有其他任何內容將使用該圖像時。 為了知道這一點,人們必須知道舊圖像的來源。 在某些情況下,創建圖像只是為了分配給PictureBox 在其他情況下,圖像可以是旨在共享和/或重用的圖像。 如果僅為了分配給PictureBox而創建圖像,則應該在Dispose PictureBox或給出另一個圖像時將其設置為Dispose d。 如果圖像應該被共享或重用,則這些條件不得導致它被丟棄。

一般來說,解決此類問題的正確方法是,具有IDisposable屬性的類(如PictureBox ,帶有Image )使用顯式SetImage方法而不是具有可變Image屬性,並且SetImage方法包含一個參數,指示是否PictureBox應負責處理它。 當且僅當前一個SetImage調用給它負責時,在PictureBox上調用SetImageDispose應該在保持的圖像上調用Dispose 不幸的是, PictureBox不能這樣工作,但我強烈建議將其用作您編寫的包含IDisposable對象的未來類的模式。

是的你應該。 它實現了IDisposable。
根據一般經驗法則,處置實現IDisposable的所有對象。 不要把它留給GC。

bm只需要在最后處置,還是應該在每次重新創建之前處理?

它應該在每次“娛樂”之前處理。 不要將對象與對象引用混淆。 “new Bitmap”創建一個新對象。 “bm”是恰好指向該對象的引用。 他們不一樣。 您不是在這里“重新創建”任何對象 - 您正在創建一個新對象,然后刪除對前一個對象的所有引用,這意味着我將在(近)未來的某個時間進行垃圾回收。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM