[英]Why is my C# Singleton not working?
我是.net的新手,這也是我在這里的第一篇文章,因此對於我可能正在做的任何新手錯誤,我們都表示歉意:)
問題的背景。 我正在開發一個C#項目,作為其中的一部分,我必須將Windows窗體數據存儲到數據庫中。 我正在使用數據類“人員”將Windows窗體數據傳輸到一個負責代表Windows窗體訪問數據庫的類。 我希望在Windows窗體代碼上使用Singleton模式,以防止存在多個窗口實例。
問題我想在保存按鈕事件處理代碼中創建一個“人”對象,用用戶輸入的值填充該對象,然后將其發送到數據庫中。 問題出現在這里。 不會填充“人”對象! 我嘗試以另一種形式進行此操作,在這種形式中我沒有修改代碼以適應單例模式,並且可以正常工作。
那我在做什么錯呢? 有沒有辦法讓我仍然保持單例模式並使之正常工作?
窗口表單代碼
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();
}
謝謝。 杜米杜
您兩次調用InitializeComponent
。 試試看:
private static CreateAdmin _instance;
public static CreateAdmin Instance
{
get { return _instance ?? (_instance = new CreateAdmin()); }
}
在我看來,thefiloe的解決方案是最干凈的,但是還有進一步的可能性在C#中引入(有效的)單例:
public static readonly CreateAdmin Instance = new CreateAdmin();
客戶代碼:
CreateAdmin.Instance.DoSomething()
但是正如已經提到的,我推薦thefiloe的方式!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.