2012-07-09 81 views
0

如果我有擁有管理IDisposable對象需要保持周圍的窗體的壽命(即一流水平的成員,或許是一類包裝和管理的單元測試的緣故定時器)形式,什麼時候應該打電話Dispose()我應該在哪裏處理由表單管理的對象?

對於這個問題(避免「GC將其丟棄你」式的答案),我們還假設有額外的停機邏輯我需要調用,例如着想:

Buffer.Flush() 
Buffer.Dispose() 

我可以將其放入我的部分類(Form.Designer.vb)中Dispose()方法的現有實現中,但修改該類通常是不被接受的。

看來,FormClosedDisposed事件將是最好的選擇。任何理由選擇一個在另一個之上?

+0

如果它實現了'IDisposable',則應該用'using'語句包裝資源的創建。 – Oded 2012-07-09 20:21:28

+0

如果是需要留級的班級成員,我不能那樣做,對嗎? (編輯問題添加這個額外的信息) – 2012-07-09 20:27:07

+0

不,你不能這樣做與領域。從你的問題中不清楚這是一個領域。請編輯並澄清。 – Oded 2012-07-09 20:28:06

回答

2

「正確的」方法是將Dispose()方法從窗體的Designer.vb文件移動到窗體的源代碼文件並對其進行編輯。然而,這在vb.net IDE中很尷尬,它隱藏了那個文件。您必須單擊「顯示所有文件」圖標才能看到它。

使用FormClosed是錯誤的,當顯示的ShowDialog您的形式,將處置你的對象太早()。當您檢索對話結果時,這可能會導致ObjectDisposed異常。

使用Disposed事件很好。

0

在C#winforms中,我將Dispose()方法的實現從設計器移動到代碼隱藏文件。從來沒有遇到過問題。我猜你可以在VB中做同樣的事情。

這是唯一重要的事情是,你保持這種部署的Components收集的代碼。

0

一般而言,您應該儘可能安全地釋放非託管資源,例如使用using語句。它通常會使您的應用程序更安全地維護並減少與資源生命週期相關的死鎖和其他不當行爲,而不是習慣性地將資源保留在「以防萬一」或完全不必要的情況下。但是,出於性能方面的原因,有時您需要「緩存」非託管資源,或者出於語義原因(例如,在UI級別上互斥的某些有意鎖定方案),您甚至需要保留一個資源。

在這些情況下,從父對象的Dispose調用Dispose是一個很好的約定;在這種情況下通過處理Disposed事件。

FormClosed由於另一個處理程序可能會阻止關閉發生,或者父窗體的處理程序代碼可能會調用此窗體的方法,並且您最終可能會使用已處理的資源,因此風險更大。當在整個表單上直接調用Dispose時,再加上從不釋放資源的風險。

將任何代碼放入FormClosed的主要優勢是「更加健康」的操作環境,尤其是對父表單的訪問。然而,這很少需要處理非託管資源。

相關問題