C# получить свойство в List, что приводит к переполнению стека
Здравствуйте, я довольно новичок в C#, поэтому я не совсем уверен, что то, что я пытаюсь сделать, возможно,
Я в основном пытаюсь установить свойство get в List, когда этот список загружается, он будет читать информацию из другого списка, методология такова:
Если родительский список пуст, создайте новый список. В противном случае переберите элементы родительских списков и обработайте каждый соответственно
Однако метод get приводит к переполнению стека, при запуске его через отладчик, который, кажется, запускается снова и снова, пока стек не сработает, даже если он обработал мой оператор return
Вот код:
public ICollection<History> History
{
get {
if (HistoryKeyCount == 0)//HistoryKeyCount = Count of Parent List
{
History = new List<Histories>();
}
else
{
History = new List<Histories>();//Created again because after each read object is dropped from memory
foreach (HistoryKey x in ParentList)
{
if (x.Key == null)
{
// Do nothing
}
else
History.Add(ObjectFinder.FindObject<ParentList>(x.Key));
}
}
return History;
}
set {
//Not implemented yet
}
}
Что происходит, когда он входит в метод get, достигает оператора if, создает новый объект, возвращает его, затем делает это снова и снова, пока не возникнет исключение stackru
Проблема не в классе ObjectFinder или создании новых методов, они даже не достигаются при возникновении ошибки.
Первоначально я думал, что это новый объект, создаваемый после каждого экземпляра оператора if, однако после добавления флага, чтобы он создавался только после того, как проблема не устранена.
Кто-нибудь когда-нибудь сталкивался с этой проблемой раньше? Потому что это поставило меня в тупик!!
---- РЕДАКТИРОВАТЬ --- Я забыл упомянуть, что я использую платформу голых объектов для.NET, которая вполне может быть источником проблемы
1 ответ
Вы называете Историю внутри Истории, поэтому она становится рекурсивной.
History.Add(ObjectFinder.FindObject<ParentList>(x.Key));
перезвонит в вашу собственность и снова окажется в той же строке, а затем снова вызовет себя.... пока вы не исчерпаете стек
также, в конце, вы перезвоните в Историю снова..... это не может сбежать:)
У меня такое ощущение, что вы либо хотите локальную переменную, чтобы хранить коллекцию для возврата, либо вы хотите, чтобы личное поле содержало список. в любом случае, не называйте историю в истории