2012-03-21 29 views
0

这里有一个问题:为什么表单对象在变量超出范围时仍然存在?

Private void buttonFrmshow_Click(..) 
{ 
    frmEmployee f = new frmEmployee() //frmEmployee is derived from System.Windows.Form; 
    f.Show(); 
} 

现在,f为范围的局部变量局限于buttonclick方法, 1.为什么将雇员的形式被激活所有的时间虽然varible范围完了? 2.它会自动GCed? 3.上述代码中的变量f显示为空,员工表单仍然处于活动状态?幕后发生了什么?

它与线程有关吗?

+0

我可以把Form对象当作非托管资源吗? – Dhananjay 2012-03-21 05:48:35

回答

1

创建新表单时,它们将被添加到Application.OpenForms集合中,一旦局部变量超出范围,这些集合将保持在范围内。

关闭表单将从该集合中删除它并允许收集它。

+0

是Application.OpenForms在GCing表单之前GC的第一个检查点? – Dhananjay 2012-03-21 06:18:05

+0

它不一定是第一个检查点。 GC是一个复杂的野兽。如果一个对象不能再被另一个对象引用,它就有资格收集。所以,如果是那个集合,它不会是GCd。如果是,那么它会在某个时刻。本身没有“第一次检查”。 – 2012-03-21 12:55:18

0

让我们做一件事。

只要一个引用类型的对象(Form在这里)被引用GC就不会碰它。一旦参考被删除,只有GC可以被允许回收资源。

实例化一个表单后,即使在空闲时也调用各种绘图方法来持续引用它。除非用户或OS shell明确关闭它,否则它将继续占用应用程序主线程下的资源。