例如,在此代碼:該方法完成後,在方法中創建的控件會發生什麼變化?
void ButtonCreator()
{
Button elboton = new Button();
}
我把這種方法後,用什麼發生elboton
?
例如,在此代碼:該方法完成後,在方法中創建的控件會發生什麼變化?
void ButtonCreator()
{
Button elboton = new Button();
}
我把這種方法後,用什麼發生elboton
?
如果它們未被某個其他對象(例如容器)引用,則它們變得無法訪問並且有資格被垃圾收集器收集。這與創建任何其他對象相同。
注意,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
塊。
@ D.P .:垃圾收集是否自動完成?或者如何「召喚」它呢? = P – Luiscencio 2010-01-27 23:29:21
是的,當運行時「感覺」有意義時,GC會偶爾運行。 – Lucero 2010-01-27 23:31:10
那麼,GC可以通過編程方式調用嗎?或者只是「當運行時覺得這樣做是有道理的」? – Luiscencio 2010-01-27 23:34:44
所有對它的引用都被銷燬,垃圾收集器最終會吞噬它。如果您將該按鈕分配給某個其他上下文中的存在(添加一個超出此方法範圍的引用),它將保留。
會有在該實例上沒有提及,它會通過在一段時間後GC清理...
在您的例子elboton
將通過GC(垃圾收集器)下一次迭代GC收集開始。這是因爲它在ButtonCreator()完成後不被引用。
爲什麼有人會這樣做?要獲得一個按鈕在屏幕上顯示,您需要將它添加到某個容器的Controls集合中......並且此時其他事物將引用它並且不會被GC'd。 – 2010-01-27 23:33:32
@Bryan Batchelder:我正在做webBrowser上隱藏的網頁。 – Luiscencio 2010-01-27 23:36:45