我目前遇到一个问题,一个类似乎正在创建其自身的实例或重复其构造函数,从而导致无限循环。
我有一个名叫旅馆的辛格尔顿。当前,它包含一个二维数组的Room(Room[,] HotelGridLayout
)和一个其来宾/客户列表(Guests
)。它在酒店构造函数的最后一行创建一个客户。
客户构造函数:
public Customer(string _classPref, Room _entrance)
{
ClassificationPreference = _classPref; // Preference for classification (type of room)
FilePath = @"HotelPictures\Customer.png"; // String for image file path
CheckIn(_entrance);
}
CheckIn():
private void CheckIn(Room _entrance)
{
_entrance.UpdateForgroundImage(FilePath);
Room _roomAvailable = HotelForm.Instance.CheckInAtHotel(ClassificationPreference);
// some more stuff that doesn't even get reached.
}
酒店构造函数的重要部分:
private HotelForm()
{
HotelGridLayout = JsonToHotelLayout.DeserializeHotelLayout(JsonString); // not the issue
Customers = new List<MovableObject>();
Cleaners = new List<MovableObject>();
MovableObject _testGuest = new Customer("5 stars", HotelGridLayout[1, 0]);
}
这是交易:在_entrance.UpdateForgroundImage(FilePath);
之后,恰好在调用CheckInAtHotel()
之前,它要么创建新的Customer类,要么重新运行构造函数。它不应该与UpdateForgroundImage有任何关系,因为它会仅分配显示在PictureBox中的图像(1行)。
UpdateForgroundImage:
public virtual void UpdateForgroundImage(string _imageFilePath)
{
PictureBoxRoom.Image = Image.FromFile(Path.Combine("..", "..", "..", "..", _imageFilePath));
}
这是怎么回事?我只是瞎了,错过了完全显而易见的东西吗?
问题来源:
我找到了问题的根源:在Customer.CheckIn()中,我通过其静态属性获取了HotelForm实例。由于该客户是在HotelForm的构造函数中创建的,并且在设置实例之前先请求了该实例,因此它会继续创建/更新HotelForm的实例;该代码说明了原因:
public static HotelForm Instance
{
get
{
lock (_padlock)
{
if (_instance == null)
{
_instance = new HotelForm();
}
return _instance;
}
}
}
该实例尚不存在,因为构造函数尚未完成(可以这么说),因此它创建了HotelForm的新实例,并重复了因此不断创建客户的过程。