2010-01-27 35 views
1

例如,在此代碼:該方法完成後,在方法中創建的控件會發生什麼變化?

void ButtonCreator() 
{ 
    Button elboton = new Button(); 
} 

我把這種方法後,用什麼發生elboton

+0

爲什麼有人會這樣做?要獲得一個按鈕在屏幕上顯示,您需要將它添加到某個容器的Controls集合中......並且此時其他事物將引用它並且不會被GC'd。 – 2010-01-27 23:33:32

+0

@Bryan Batchelder:我正在做webBrowser上隱藏的網頁。 – Luiscencio 2010-01-27 23:36:45

回答

5

如果它們未被某個其他對象(例如容器)引用,則它們變得無法訪問並且有資格被垃圾收集器收集。這與創建任何其他對象相同。

注意,System.Windows.Forms.Control類(及其子類一樣Button)都實現了IDisposable接口,所以要確保與Button相關的任何非託管資源被釋放的最簡單的方法是使用using塊,就像這樣:

using(Button elboton = new Button()) { 
    // Do whatever you need to do 
} 
// elboton is now disposed 

然而,任何管理與對象關聯不會被回收的資源,直到GC運行,不管你是否使用using塊。

+0

@ D.P .:垃圾收集是否自動完成?或者如何「召喚」它呢? = P – Luiscencio 2010-01-27 23:29:21

+0

是的,當運行時「感覺」有意義時,GC會偶爾運行。 – Lucero 2010-01-27 23:31:10

+0

那麼,GC可以通過編程方式調用嗎?或者只是「當運行時覺得這樣做是有道理的」? – Luiscencio 2010-01-27 23:34:44

0

所有對它的引用都被銷燬,垃圾收集器最終會吞噬它。如果您將該按鈕分配給某個其他上下文中的存在(添加一個超出此方法範圍的引用),它將保留。

0

會有在該實例上沒有提及,它會通過在一段時間後GC清理...

0

在您的例子elboton將通過GC(垃圾收集器)下一次迭代GC收集開始。這是因爲它在ButtonCreator()完成後不被引用。

相關問題