2011-11-23 2 views
1

나에게는 매우 혼란스러운 문제가 있습니다. 내 클래스의 생성자에서 두 배열 (문자열 및 이중)을 보유하는 SeatManager.cs의 인스턴스를 만듭니다. btnReserveCancel_Click 메서드에서 데이터로이 두 배열을 채우려고합니다. 하지만 나중에 UpdateGUI() 메서드를 호출하면 SeatManager.cs의 다른 인스턴스가 만들어집니다 (선생님은 다른 작업에 도움이 필요할 때 해당 선을 추가했습니다). 그러면 두 개의 배열에 채워진 모든 데이터가 잃어버린! wierd 부분은 내가 UpdateGUI()에서 새로운 인스턴스를 생성하는 줄을 지우면 컴파일러는 나에게 뭔가 잘못되었다고 외친다.개체의 인스턴스 호출

btnReserveCancel_Click이 아닌 경우 UpdateGUI()에서 SeatManager.cs의 새 인스턴스가 필요한 이유는 무엇입니까? 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); 
     } 
    } 
+1

해당 줄을 제거 할 때 발생하는 오류는 무엇입니까? – Tudor

+0

nullreferenceexception이 처리되지 않았습니다. – user1051477

답변

1

는 (참조가 존재하지 않습니다 제공) 결국 쓰레기 수거. 따라서 UpdateGUI() 안에 새 인스턴스를 만들 때 이전에 채워진 모든 데이터가 손실되는 것입니다.

메서드 호출을 통해 상태를 유지하려는 경우 정확한 버전은 분명히 새 인스턴스가 없습니다. 해당 줄을 제거하면 컴파일러 오류가 무엇입니까?

편집 :

private SeatManager seatMng = new SeatManager(totalNumOfSeats); 
+0

nullreferenceexception이 처리되지 않았습니다. – user1051477

+0

편집에 도움이되는지 확인하십시오. – Tudor

+0

! Sweeeeeet! 고마워요! 궁금 해서요, 왜 작동 했나요? 생성자에서 객체를 인스턴스화 할 때 오류가 발생하는 이유는 무엇입니까? – user1051477

0

당신은 당신의 SeatManager 클래스의 코드를 게시 할 필요가 또는 무엇을 알고 힘들 것입니다 : 당신은 seatMngr 또한 인스턴스를 만들고 생성자에서 제거하려고 선언 할 때 진행되고있다. 지금 현재 주석 처리 된 행이 주석 처리되지 않으면 현재 현재 문제가 표시되지 않습니다.

//seatMngr = new SeatManager(totalNumofSeats); 

주석 처리되지 않았습니다.

+0

null 참조 예외가 처리되지 않았습니다. – user1051477

관련 문제