【问题标题】:why the Form Object is still live when variable goes out of scope?为什么当变量超出范围时表单对象仍然存在?
【发布时间】:2012-03-21 05:46:23
【问题描述】:

这是一个问题:

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

现在 f 是局部变量,其作用域仅限于 buttonclick 方法, 1. 为什么 Employee 表单在变量作用域完成后却一直处于活动状态? 2. 会自动GCed吗? 3. 上面代码中的变量 f 显示为空,但员工表单仍然处于活动状态?幕后发生了什么?

这与线程有关吗?

【问题讨论】:

  • 我应该将表单对象视为非托管资源吗?

标签: c# .net winforms scope local-variables


【解决方案1】:

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

关闭表单会将其从该集合中移除并允许其被收集。

【讨论】:

  • Application.OpenForms 在 GC 表单之前是 GC 的第一个检查点吗?
  • 不一定是第一个检查点。 GC是一个复杂的野兽。如果一个对象不能再被另一个对象引用,它就有资格被收集。所以,如果是那个集合,它就不会是 GCd。如果是,那么它将在某个时候。本身没有“第一次检查”。
【解决方案2】:

让我们把一件事弄清楚。

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

在实例化一个表单后,即使它处于空闲状态,也会通过调用各种绘制方法来连续引用它。除非被用户显式关闭,否则 OS shell 会一直占用 Application 主线程下的资源。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2012-04-22
    • 1970-01-01
    • 2012-08-27
    • 2014-07-01
    • 2020-09-04
    • 2022-11-16
    相关资源
    最近更新 更多