Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 释放或清除已创建的对象_C#_Windows_Winforms_Forms - Fatal编程技术网

C# 释放或清除已创建的对象

C# 释放或清除已创建的对象,c#,windows,winforms,forms,C#,Windows,Winforms,Forms,我有两个windows窗体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(); } private void button1_Click(object sender, EventArgs e) {

我有两个windows窗体Form1.csForm2.cs

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

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
    this.Hide();
}
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();
}
private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
    this.Hide();
}

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

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

您可能正在查找而不是
this.Hide()
,因为前者将关闭并处理当前表单,而后者仅将其隐藏

如果要隐藏并重新显示表单,则需要保留对表单的引用。有很多考虑因素(一个表单应该只实例化一次,还是每次被请求?是否可以打开同一表单的多个实例?等等)以及可能的模式和(第三方)解决方案(例如)

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

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
{
private static Lazy _form1=new Lazy(()=>new form1());
公共静态表单1表单1
{
得到
{
返回_form1.Value;
}
}       
private static Lazy _form2=new Lazy(()=>new form2());
公共静态表单2表单2
{
得到
{
返回_form2.Value;
}
}
}

然后,在代码中的任何地方,都可以执行
FormRegistry.Form1.Show()
。请注意,此代码是一个概念验证,有许多问题和改进空间,但它可以为您提供总体思路。

确切地说,您的问题是什么?新-“最近或现在首次生产、介绍或发现;以前不存在。”这正是我要寻找的。谢谢,我会研究一下这个概念。