如何在C#using Dictionary中实现对象的可重用性
这是我的密码。下面解释这个问题。我要做的是使用字典在Java到C中实现哈希映射对象的可重用性 表格1如何在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
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
callUiFac.Dispose()代码>如果在表单上调用Close()
,它最终将由框架处理。改用Hide()
方法
发件人:
关闭表单时,将释放对象中创建的所有资源,并释放表单
正如NightOwl在评论中所说的,我建议您在关闭应用程序时,通过字典循环,关闭或处理所有存在的表单,以避免资源泄漏。您可以通过在UiFac
类中实现接口并对集合中的所有表单调用Dispose
来实现这一点:
public sealed class UiFac : IDisposable
{
...
public void Dispose()
{
// Call dispose on all forms
}
}
关闭Form1
callUiFac.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