簡體   English   中英

為什么我的C#Singleton不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM