释放或清除已创建的对象

时间:2015-03-11 08:44:13

标签: c# windows winforms forms

我有两个窗口形式; Form1.cs Form2.cs

以下是 Form1.cs 的代码,其中将显示 Form2.cs 并隐藏当前的 Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
    this.Hide();
}

以下是 Form2.cs 的代码,其中将显示 Form1.cs 并隐藏当前的 Form2.cs

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
    this.Hide();
}

我已经监视了应用程序的内存使用情况,我注意到每次执行上面的代码时应用程序的内存使用量都在增加。

1 个答案:

答案 0 :(得分:3)

您在每次点击按钮时都会创建新表单,因此您可以在多次单击按钮后在内存中保存多个实例。

您可能正在寻找this.Close()而不是this.Hide(),因为前者会关闭并处理当前表单,而后者只会隐藏它。

如果要隐藏和重新显示表单,则需要保留对表单的引用。有很多考虑因素(表单应该只实例化一次,还是每次请求实例化?是否可以打开同一表单的多个实例?等等)以及可能的模式和(第三方)解决方案(例如Application ControllerWhat is a proper way of building Winform apps with multiple “screens”)。

一种解决方案是简单地创建自己的表单注册表,其中每个表单都有一个单例:

public static class FormRegistry
{
    private static Lazy<Form1> _form1 = new Lazy<Form1>(() => new Form1());
    public static Form1 Form1 
    {
        get 
        {
            return _form1.Value;
        }
    }       
    private static Lazy<Form2> _form2 = new Lazy<Form2>(() => new Form2());
    public static Form2 Form2 
    {
        get 
        {
            return _form2.Value;
        }
    }
}

然后在代码中的任何地方,您都可以FormRegistry.Form1.Show()。请注意,此代码是一个概念证明,存在许多问题,而且还有很大的改进空间,但它可以为您提供一般性的想法。