gpt4 book ai didi

c# - 为什么我的 C# Singleton 不工作?

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:12 25 4
gpt4 key购买 nike

我是 .net 的新手,这也是我在这里发表的第一篇文章,因此对于我可能犯的任何新手错误提前致歉:)

问题的背景。我正在开发一个 C# 项目,作为其中的一部分,我必须将 Windows 窗体数据存储到数据库中。我正在使用数据类“person”将 windows 窗体数据传输到负责代表 windows 窗体访问数据库的类。我希望在 Windows 窗体代码上使用 Singleton 模式来防止窗口的多个实例存在。

问题在保存按钮事件处理代码中,我希望创建一个“Person”对象,用用户输入的值填充它并将其发送以保存到数据库中。问题出现在这里。 “Person”对象没有被填充!我尝试过以另一种形式执行此操作,其中我没有修改代码以适应单例模式并且有效。

那么我在这里做错了什么?有没有办法让我仍然保持单例模式并使其工作?

窗体代码

namespace AgTrain
{
public partial class CreateAdmin : Form
{
private static CreateAdmin instance;

private CreateAdmin()
{
InitializeComponent();
}

private void CreateAdmin_Load(object sender, EventArgs e)
{

}

public static CreateAdmin getInstance()
{
if(instance==null)
{
instance = new CreateAdmin();
instance.InitializeComponent();
}
return instance;
}

public void makeInstanceNull()
{
instance = null;
}

private void button1_Click(object sender, EventArgs e)
{
Person personToBeSaved = new Person();
PersonDAO personDAO = new PersonDAO();


personToBeSaved.FirstName = textBox1.Text;
personToBeSaved.LastName = textBox2.Text;
personToBeSaved.Address = textBox3.Text;
personToBeSaved.TelNo = textBox4.Text;
personToBeSaved.UserName = textBox5.Text;
personToBeSaved.Password = textBox6.Text;
personToBeSaved.UserType = "admin";

personDAO.addPerson(personToBeSaved);
}

}
}

调用方代码

private void createAdminToolStripMenuItem_Click(object sender, EventArgs e)
{
CreateAdmin creAdmin = CreateAdmin.getInstance();
creAdmin.Closed += (s, ex) => { creAdmin.makeInstanceNull(); };
creAdmin.MdiParent=this;
creAdmin.Show();
}

谢谢。嘟嘟嘟

最佳答案

在我看来,thefiloe 的解决方案是最干净的,但还有一种在 C# 中引入(有效的)单例的可能性:

public static readonly CreateAdmin Instance = new CreateAdmin();

客户端代码:

CreateAdmin.Instance.DoSomething()

但如前所述,我推荐 thefiloe 的方式!

关于c# - 为什么我的 C# Singleton 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com