2012-06-25 65 views
0

你好,我是很新的C#,所以我不能完全確定什麼,我試圖做的是可能的,C#在列表獲取屬性導致堆棧溢出

我基本上是試圖設置,獲取屬性上一個列表, ,列表加載它會從另一個列表中讀取信息,方法是:

如果父列表是空的,創建一個新的列表 否則遍歷父列出的元素和處理每個相應

但是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裸對象框架,它很可能是問題

+0

你在哪裏調用get方法?發佈該代碼。 –

+0

同時發佈「歷史」的定義 –

+1

我們可以假設歷史來自'ClaimHistory'嗎? – Kane

回答

4

的您在歷史通話記錄源,所以它成爲遞歸。

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

將回調到你的財產,並再次在同一行上結束,然後再調用自身....直到你用完了棧

還會在最後,你回電話進入歷史再次.....它不能逃脫:)

我有一種感覺,你要麼本地變量,持有一個集合返回,或者你想要一個私人字段來保存列表。不管怎樣,不要撥打歷史記錄

+0

我可以看到你來自哪裏,但是當我註釋掉構造函數時,只留下返回語句並留空,否則會阻止異常仍然發生,除非我誤解了你的觀點。 – scrineym

+1

return語句返回的是ITSELF的歷史記錄,所以它直接調回屬性獲取器,如果要將列表存儲在私有字段中,即私人名爲_History,則它不能離開 –

+0

...然後做_History.Add()並在最後返回_History –