Вызов экземпляра объекта - PullRequest
1 голос
/ 23 ноября 2011

У меня проблема, которая меня очень смущает. В конструкторе моего класса я создаю экземпляр SeatManager.cs, который содержит два массива (строковый и двойной). В методе btnReserveCancel_Click я пытаюсь заполнить эти два массива данными. Но когда я позже вызываю метод UpdateGUI (), создается другой экземпляр SeatManager.cs (мой учитель добавил эту строку кода, когда мне понадобилась помощь по другому вопросу), и когда это происходит, все данные, которые я только что заполнил в двух массивах, получают потерял! Самое странное то, что если я удаляю строку, которая создает новый экземпляр в UpdateGUI (), компилятор кричит мне, что что-то не так.

Зачем UpdateGUI () нужен новый экземпляр SeatManager.cs, а btnReserveCancel_Click нет? Зачем UpdateGUI () нужен новый экземпляр SeatManager.cs, если он доступен в переменных экземпляра?

    private double revenue = 0.0;
    private const int totalNumOfSeats = 10;
    private int numOfReservedSeats = 0; //Increases every time a new reservation is made
    const double minLimit = 10;
    const double maxLimit = 50;
    private SeatManager seatMngr;

    public MainForm()
    {
        InitializeComponent();
        InitializeGUI();
        seatMngr = new SeatManager(totalNumOfSeats);//skapar en instans av klassen SeatManager
        UpdateGUI();
    }



    private void btnReserveCancel_Click(object sender, EventArgs e)
    {
        if (rbtnReserved.Checked == true)//Om radiobutton RESERVE är iklickad
        {
            string customerName = string.Empty;
            double seatPrice = 0.0;

            int selection = listBox1.SelectedIndex;
            if (selection == -1)
            {
                MessageBox.Show(string.Format("You must select which seat you want to reserve!"), "Select a seat.", MessageBoxButtons.OK, MessageBoxIcon.None);

            }
            else
            {
                string getSeatNumber = listBox1.SelectedItem.ToString();//Tar första bokstaven i den markerade strängen i listboxen och gör om till index.
                int seatNumber = int.Parse(getSeatNumber.Substring(0, 1));

                bool inputOk = ReadAndValidateInput(out customerName, out seatPrice);
                bool validSeats = CheckVacantSeats();

                if (inputOk && validSeats)
                {
                    if (seatMngr.ReserveSeat(customerName, seatPrice, seatNumber) != true)
                    {
                        var result = MessageBox.Show(string.Format("Do you wish to overwrite reservation? "), "Seat already registered", MessageBoxButtons.YesNo, MessageBoxIcon.None);
                        if (result == DialogResult.Yes)
                        {
                            double amount = seatMngr.GetPaidPrice(seatNumber);
                            MoneyBackWhenCancelOrOverwrite(amount);
                            seatMngr.ReserveSeatOverwrite(customerName, seatPrice, seatNumber);
                            revenue += seatPrice;
                        }
                    }
                    else
                    {
                        seatMngr.ReserveSeat(customerName, seatPrice, seatNumber);
                        numOfReservedSeats++;
                        revenue += seatPrice;
                        if (seatMngr.ReserveSeat(customerName, seatPrice, seatNumber) == true)
                        {
                            MessageBox.Show(string.Format("Det funkade "), "Sfgdfg", MessageBoxButtons.OK, MessageBoxIcon.None);
                        }
                    }
                }
            }
        }
        else if (rbtnCancel.Checked == true)//Om radiobutton CANCEL är iklickad.
        {
            string getSeatNumber = listBox1.SelectedItem.ToString();//Tar första bokstaven i den markerade strängen i listboxen och gör om till index.
            int seatNumber = int.Parse(getSeatNumber.Substring(0, 1));

            var result = MessageBox.Show(string.Format("Do you wish to cancel reservation? "), "Seat registered", MessageBoxButtons.YesNo, MessageBoxIcon.None);
            if (result == DialogResult.Yes)
            {
                double amount = seatMngr.GetPaidPrice(seatNumber);
                MoneyBackWhenCancelOrOverwrite(amount);
                seatMngr.CancelSeat(seatNumber);
                numOfReservedSeats--;
            }
            else { }
        }
        UpdateGUI();
    }



    private void UpdateGUI()
    {
        labelVacant.Text = (totalNumOfSeats - numOfReservedSeats).ToString();//Visar antal ledig platser.
        labelReserved.Text = numOfReservedSeats.ToString();//Visar antal reserverade platser.
        labelRevenue.Text = revenue.ToString();//Visar intäkter.
        labelSeats.Text = totalNumOfSeats.ToString();//Visar totalt antal platser. Värdet är konstant så det kan inte ändras.
        DisplayOptions choice = (DisplayOptions)comboBox1.SelectedIndex;

        string[] strSeatInfoStrings;


        //seatMngr = new SeatManager(totalNumOfSeats);

        int display = seatMngr.GetSeatInfoStrings(choice, out strSeatInfoStrings);
        listBox1.Items.Clear();
        if (strSeatInfoStrings == null)
        {
            listBox1.Items.Add("No seats where found");
        }
        else
        {
            listBox1.Items.AddRange(strSeatInfoStrings);
        }
    }

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Если у вас есть ссылка, указывающая на объект в памяти, и затем вы назначаете ему новый экземпляр, объект, на который он ранее указывал, «теряется» (при условии, что на него больше нет ссылок) и в конечном итоге получает сборщик мусора. Вот почему вы теряете все ранее заполненные данные при создании нового экземпляра внутри UpdateGUI().

Правильная версия, очевидно, без этого нового экземпляра, если вы планируете поддерживать состояние при вызовах методов. Какую ошибку компилятора вы получите, если удалите эту строку?

Редактировать : Когда вы объявляете seatMngr, попробуйте также создать экземпляр и удалить его из конструктора:

private SeatManager seatMng = new SeatManager(totalNumOfSeats);
0 голосов
/ 23 ноября 2011

Вам необходимо опубликовать код для вашего класса SeatManager, иначе будет сложно понять, что происходит.Прямо сейчас я не вижу проблемы, если строка, которая в данный момент закомментирована:

//seatMngr = new SeatManager(totalNumofSeats);

не закомментирована.

...