Ну, свойство ID
возвращает само по себе
public int ID
{
get
{
return ID;
}
...
и, таким образом, у вас переполнение стека : когда вы читаете ID
, оно вызывает ID
который в свою очередь вызывает ID
и т. д. Та же проблема с set
: вы присваиваете значение свойству ID
, что приводит к присвоению значения ID
и т. д. Чтобы разорвать этот замкнутый круг , давайте представим вспомогательное поле
private int m_ID;
public int ID
{
get
{
//DONE: now we just read m_ID, not call the property
return m_ID;
}
set
{
//DONE: you want to validate value, not ID, right?
//DONE: ArgumentOutOfRangeException - value is out of valid range
if (value < 0 || value > 999)
throw new ArgumentOutOfRangeException(nameof(value),
"Id must between [000-999]");
//DONE: we assign value to the field, not to the property
m_ID = value;
}
}