如何在C#using Dictionary中实现对象的可重用性

如何在C#using Dictionary中实现对象的可重用性,c#,winforms,dictionary,C#,Winforms,Dictionary,这是我的密码。下面解释这个问题。我要做的是使用字典在Java到C中实现哈希映射对象的可重用性 表格1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 bb = (Form2)UiFac.loa

这是我的密码。下面解释这个问题。我要做的是使用字典在Java到C中实现哈希映射对象的可重用性

表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 bb = (Form2)UiFac.loadUi();
    }
}
表格2

public partial class Form2 : Form
{
    int a = 1;
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Console.WriteLine(a.ToString());
        a++;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.ExitThread();
    }

    public Form2 getForm2()
    {
        return this;
    }
}
UiFac

public class UiFac
{
    public enum UiName
    {
        LOGIN,
        HOME
    }
    static Dictionary<UiName,Form> map = new Dictionary<UiName, Form>();

    public static Form loadUi()
    {
        Form theForm;
        map.TryGetValue(UiName.HOME, out theForm);
        if (shit == null)
        {
            Form2 bb = new Form2();
            Console.WriteLine("Inside if " + bb.GetHashCode());
            map.Add(UiName.HOME, bb);
            bb.Show();
        }
        else
        {
            map.TryGetValue(UiName.HOME,out theForm);
            Console.WriteLine("Inside else " + shit.GetHashCode());
            Form2 ff = (Form2)theForm;
            ff = ff.getForm2();
            ff.Show();
        }
        return theForm;
    }
}
公共类UiFac
{
公共枚举UiName
{
登录,
家
}
静态字典映射=新字典();
公共静态表单loadUi()
{
形成形式;
map.TryGetValue(UiName.HOME,out theForm);
如果(shit==null)
{
Form2 bb=新的Form2();
WriteLine(“内部if”+bb.GetHashCode());
地图添加(UiName.HOME,bb);
bb.Show();
}
其他的
{
map.TryGetValue(UiName.HOME,out theForm);
WriteLine(“Inside-else”+shit.GetHashCode());
Form2 ff=(Form2)格式;
ff=ff.getForm2();
ff.Show();
}
返回表单;
}
}
我使用java中的哈希映射实现了这一点,它工作得非常好。然后我需要用C#做同样的事情。当我第一次按Form1中的
按钮1
Form2
加载。但当我关闭它并再次按
Form1
中的
按钮1
时,它会在System.Windows.Forms.dll中抛出
System.ObjectDisposedException'

我错过了什么

谢谢大家!

如果在表单上调用
Close()
,它最终将由框架处理。改用
Hide()
方法

发件人:

关闭表单时,将释放对象中创建的所有资源,并释放表单

正如NightOwl在评论中所说的,我建议您在关闭应用程序时,通过字典循环,关闭或处理所有存在的表单,以避免资源泄漏。您可以通过在
UiFac
类中实现接口并对集合中的所有表单调用
Dispose
来实现这一点:

public sealed class UiFac : IDisposable
{
    ...

    public void Dispose()
    {
        // Call dispose on all forms
    }
}
关闭
Form1
call
UiFac.Dispose()

如果在表单上调用
Close()
,它最终将由框架处理。改用
Hide()
方法

发件人:

关闭表单时,将释放对象中创建的所有资源,并释放表单

正如NightOwl在评论中所说的,我建议您在关闭应用程序时,通过字典循环,关闭或处理所有存在的表单,以避免资源泄漏。您可以通过在
UiFac
类中实现接口并对集合中的所有表单调用
Dispose
来实现这一点:

public sealed class UiFac : IDisposable
{
    ...

    public void Dispose()
    {
        // Call dispose on all forms
    }
}

关闭
Form1
call
UiFac.Dispose()

可能是当你“关闭”表单2时,它实际上关闭了表单(处理掉它,使它消失,对象不再好)?@Dweeberlyv当我关闭它时,对象会被销毁吗?如果没有,则对象地址保存在字典中。那么为什么我不能调用Show()方法?@KumarathungaMunidasa为什么要重用Form2?如果是因为不想重置所有数据,那么应该将其隐藏而不是关闭。如果是因为您认为这对性能有好处,那么就不用麻烦了。这不值得。当你关闭一个表单(红色X)时,表单就会被销毁。这样考虑一下,如果你在一个应用程序中只有一个表单,并且你关闭了它,你想让它挂起来吗?您可以将窗体设置为对话框(ShowDialog)或覆盖关闭行为(因此对象不会被释放)。@SamIam我可以隐藏和显示。但我真的很想解决这个问题。如果它在java中工作,那么在C中应该有一种方法。我想知道它是什么。是不是当你“关闭”窗体2时,它实际上关闭了窗体(处理掉它,使它消失,对象不再好)?@Dweeberlyv当我关闭它时对象会被销毁?如果没有,则对象地址保存在字典中。那么为什么我不能调用Show()方法?@KumarathungaMunidasa为什么要重用Form2?如果是因为不想重置所有数据,那么应该将其隐藏而不是关闭。如果是因为您认为这对性能有好处,那么就不用麻烦了。这不值得。当你关闭一个表单(红色X)时,表单就会被销毁。这样考虑一下,如果你在一个应用程序中只有一个表单,并且你关闭了它,你想让它挂起来吗?您可以将窗体设置为对话框(ShowDialog)或覆盖关闭行为(因此对象不会被释放)。@SamIam我可以隐藏和显示。但我真的很想解决这个问题。如果它在java中工作,那么在C中应该有一种方法。我想知道是什么,谢谢!我重写了关闭按钮并隐藏了formIt,指出
UiFac
类应该实现
IDisposable.Dispose()
,这样它就可以在
map
中循环,处理实例,然后清除
map
UiFac
的调用者负责对其调用
Dispose()
,否则这些表单可能会导致资源泄漏。@KumarathungaMunidasa-Peter已经用一个示例更新了答案。查看完整的详细信息。请注意,静态变量和IDisposable不能很容易地混合在一起-使用实例变量可能更有意义。谢谢!我重写了关闭按钮并隐藏了formIt,指出
UiFac
类应该实现
IDisposable.Dispose()
,这样它就可以在
map
中循环,处理实例,然后清除
map
UiFac
的调用者负责对其调用
Dispose()
,否则这些表单可能会导致资源泄漏。@KumarathungaMunidasa-Peter已经用一个示例更新了答案。查看完整的详细信息。请注意,静态变量和
IDisposable
don