2014-04-19 36 views
0

我對我的FormLabel。當我撥打Dispose()方法時,對象從Form中刪除。但是我仍然可以設置它的屬性。在對物體調用Dispose()方法後發生了什麼。我可以恢復它並再次顯示嗎?我處理對象後會發生什麼?

public void MyMethod() 
{ 
    label1.Dispose(); 
    label1.Text = "Test"; 
    //No error happens 
} 

配置後我可以閱讀一些屬性,如左屬性。這意味着標籤仍然存在於某個地方。我如何完全刪除它?

+0

在互聯網上有很多文章很好地解釋了這個話題。谷歌有多難? – walther

+0

當你調用對象的Dispose方法時,對象的Dispose方法被執行。這只是一個普通的舊方法,在大多數情況下都是在實現'IDisposable.Dispose'。關於該方法的唯一特別之處在於,如果您在'using'塊中使用該對象,則會自動調用該方法。 –

回答

10

在這種情況下會發生什麼,是控件的句柄被破壞(並因此從其父類中刪除)。處置後,它不能再添加到可見的顯示器中。但是,對象本身(如類實例中)仍然存在,因此可以設置大多數屬性。 (有些會給出一個對象置換的異常,例如試圖獲得Handle屬性)

一般來說,哪些屬性仍然可以設置,取決於對象的實現(IDispose接口)以及它檢查它是否在處置。

+0

還有一件事要補充。它與UI無關。這是一般的「Dispose」模式。 –

+0

處理後我可以閱讀一些屬性,如左屬性。這意味着標籤鋼材存在於某個地方。我如何完全刪除它? – mohammad

+0

對於要從內存中釋放的對象,它必須可用於垃圾收集。要做到這一點,首先就是所有對它的引用都必須消失。因此,第1步將在處理完成後設置:label1 = null;處置是一個單獨的步驟,因爲這會立即釋放手柄。在引用被銷燬後,對象實例本身可用於garbarge集合。如果你想強制立即垃圾收集,你可以調用GC.Collect(),但通常系統會爲你做。 –

-1

dispose方法不會從內存中刪除對象。它只告訴垃圾收集器釋放它。垃圾收集器將確定何時需要釋放它。 這是一個令人困惑的話題,我也不太明白。這裏有一篇關於處置和定稿的好文章。 http://www.devx.com/dotnet/Article/33167

+1

這是一個虛假的陳述。它與GC無關。 GC不知道IDisposable,Dispose和finalizer方法都提供了一個清理資源的選項,這些選項不由GC處理。終結器由GC調用,如果一次性模式正確執行,則您有一個選項從那裏調用Dispose方法,最後釋放您分配的資源。 –

+0

我沒有說他們一起工作,他們完全獨立。我只是說GC是從內存中宣稱它的那個。 dispose方法釋放它,GC不再使用時從內存中擦除它,它不一樣。 – blade

+0

「它只告訴垃圾收集器釋放它。」這是你提到他們一起工作的地方。它沒有告訴任何GC。沒有冒犯的意思。 –

-1

obj.Dispose()命令GC銷燬該對象。如果您在obj.Dispose()之後嘗試更改其數據,則不會發生任何事情。

+0

但是我可以從中讀取數據,所以它存在於某處。 – mohammad

+1

這是不正確的。一次性處理是任意處置的。 –