【问题标题】:Freeing or clearing created objects释放或清除创建的对象
【发布时间】:2015-05-12 23:10:41
【问题描述】:

我有 2 个窗体; 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();
}

我监测了应用程序的内存使用情况,发现每次执行上述代码时应用程序的内存使用量都在增加。

【问题讨论】:

  • 对了,你的问题是什么?
  • 新 - “最近或现在首次生产、引进或发现;以前不存在。”

标签: c# windows winforms forms


【解决方案1】:

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

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

如果您想隐藏和重新显示表单,您需要保留对表单的引用。有很多考虑(一个表单应该只实例化一次,还是每次被请求?是否可以打开同一个表单的多个实例?等等)和可能的模式和(第三方)解决方案(例如Application Controller、What 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()。请注意,此代码是概念验证,存在许多问题和很大的改进空间,但它可以为您提供总体思路。

【讨论】:

  • 这正是我正在寻找的。谢谢,我会研究一下这个概念。
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多