列表中的c#get属性导致堆栈溢出

时间:2012-06-25 01:38:30

标签: c# .net list naked-objects

你好我对C#很陌生,所以我不能完全确定我想做的事情是可能的,

我基本上是想在List上设置get属性, 当此列表加载时,它将从另一个列表中读取信息,方法是:

如果父列表为空,请创建一个新列表 否则,遍历父列表元素并相应地处理每个元素

然而,get方法导致堆栈溢出,通过调试器运行它似乎只是反复运行,直到堆栈被烧断,即使它已经命中并处理了我的返回语句

以下是代码:

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语句,创建新对象,返回它然后一遍又一遍地重复,直到发生stackoverflow异常。

问题不在于ObjectFinder类或创建新方法,当发生错误时甚至都达不到。

我原本以为是在if语句的每个实例之后创建了一个新对象,但是在添加了一个标志之后,只有在问题仍然存在时才会创建它。

以前有没有人遇到过这个问题?因为它让我难过!!

---- --- EDIT 我忘了提到我正在使用.NET的裸对象框架,这很可能是问题的根源

1 个答案:

答案 0 :(得分:4)

您在历史记录中调用历史记录,因此它会递归。

History.Add(ObjectFinder.FindObject<ParentList>(x.Key));

将回调您的财产,并再次在同一行结束,然后再次自行调用....直到您用完了堆栈

也在最后,你再次回到历史......它无法逃脱:)

我觉得你要么想要一个局部变量,要么想要一个集合来返回,要么你想要一个私有字段来保存列表。无论哪种方式,都不要在历史记录中调用历史记录