0

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

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

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

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

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

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

有没有人遇到过这个问题?因为它把我难住了!!

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

4

1 回答 1

4

你在历史中调用历史,所以它变成递归的。

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

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

最后,您再次调用历史......它无法逃脱:)

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

于 2012-06-25T01:51:49.637 回答