调用对象的实例
本文关键字:实例 对象 调用 | 更新日期: 2023-09-27 18:15:45
我有一个让我很困惑的问题。在我的类的构造函数中,我创建了一个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);
}
}
如果你有一个引用指向内存中的对象,然后你给它分配一个新的实例,它以前指向的对象是"丢失"(提供没有更多的引用它),并最终被垃圾收集。这就是为什么当您在UpdateGUI()
中创建新实例时,您会丢失所有先前填充的数据。
如果你打算跨方法调用维护状态,那么正确的版本显然是没有新的实例化。如果你删除那一行,你会得到什么编译错误?
Edit:当你声明seatMngr时,也要尝试将其实例化并从构造函数中删除:
private SeatManager seatMng = new SeatManager(totalNumOfSeats);
您需要发布您的SeatManager类的代码,否则将很难知道发生了什么。现在我目前没有看到问题,除非当前被注释掉的行:
//seatMngr = new SeatManager(totalNumofSeats);
注释。