如何使c#不调用实例的析构函数

时间:2012-06-26 17:07:30

标签: c# .net winforms

我有两种形式,form1需要从form2获取数据,我使用form2构造函数中的参数来获取form1's实例,如下所示:

public form2(Form form1) {
this.f = form1;
}

并在form1中:

Form form2 = new Form(this);

但是当我关闭form1时似乎调用了form1 destruct。我的问题是如何避免这个问题?

编辑:我的问题中有很多打字错误,我很抱歉,修复:

我有两种形式,form2需要从form1获取数据,我使用form1构造函数中的参数来获取form1's实例,如下所示:

private Form f;
public form2(Form form1) {
this.f = form1;
}

并在form1中:

Form form2 = new Form(this);

但是当我关闭form2时似乎调用了form1析构函数。我的问题是如何避免这个问题?

3 个答案:

答案 0 :(得分:5)

来自MSDN

  

当表单关闭时,在对象中创建的所有资源都是   关闭,表格处理。您可以阻止关闭表单   在运行时通过处理Closing事件并设置Cancel   CancelEventArgs的属性作为参数传递给您的事件   处理程序。

因此,为了防止资源的处置,你唯一能做的就是隐藏表单而不是关闭它:

bool reallyClose;

protected override void OnClosing(CancelEventArgs e)
{
    if (!reallyClose)
    {
        e.Cancel = true;
        Hide();
    }
    base.OnClosing(e);
}

除非您在关闭表单之前手动将reallyClose标记设置为true,否则这将阻止表单关闭。

您应该确保在使用完毕后正确关闭表单。

另一种选择可能是从表单本身中分离需要从Form1检索的数据。

答案 1 :(得分:0)

在这种情况下,在form2也关闭之前,不能销毁表单1。只要form2具有对form1的引用,form1将继续存在。更有可能的是,您担心form1被处置。当form1关闭时,它将自行处理。该对象仍然存在,但它将释放其所有子控件和系统对象,如窗口句柄和绘图对象。表单处理完毕后,无法再次显示,并且所有控件都无法访问。如果您尝试使用已处置表单的任何可视组件,它将抛出ObjectDisposedException。如果要停止处理表单,只需隐藏它而不是关闭它。但是,一旦Form2不再需要它,你应该稍后关闭它,否则它会留下来消耗内存和资源。

答案 2 :(得分:0)

你应该真正考虑两种形式所需的任何数据,从而首先避免耦合形式构造函数的问题。