2009-07-29 241 views
1

我想知道爲什麼我得到堆棧溢出異常。我爲學校作業創建了一個簡單的紙牌遊戲,當我克隆卡片返回它們時,我得到了堆棧溢出異常。C#堆棧溢出

所以我得到這個卡類:

public class Card : ICloneable 
{ 
    .... 

    #region ICloneable Members 

    public object Clone() 
    { 
     return this.Clone(); // <--- here is the error thrown when the first card is to be cloned 
    } 

    #endregion 
} 

,我有一類稱爲Hand,然後克隆出牌:

internal class Hand 
{ 
     internal List<Card> GetCards() 
     { 
      return m_Cards.CloneList<Card>(); // m_Cards is a List with card objects 
     } 
} 

最後,我得到了一個擴展方法的List

public static List<T> CloneList<T>(this List<T> listToClone) where T : ICloneable 
    { 
     return listToClone.Select(item => (T)item.Clone()).ToList(); 
    } 

卡類錯誤(ICl onable法),

類型 'System.StackOverflowException' 未處理的異常發生在CardLibrary.dll

+2

做卡需要是可變的,即他們有狀態,可以改變嗎?如果沒有,那麼你可以擁有一套不可變的卡片,你可以在不同的收藏中重複使用。不需要克隆。 – pjp 2009-07-29 09:42:08

+0

請參閱關於ICloneable的討論:http://stackoverflow.com/questions/699210/why-should-i-implement-icloneable-in-c – peterchen 2009-07-29 09:57:41

+0

閱讀這個問題的標題後,我認爲這屬於元。 ..--) – EricSchaefer 2009-07-29 10:04:35

回答

22

你調用自己:

public object Clone() 
{ 
    return this.Clone(); 
} 

這導致無限遞歸。

你的clone()方法應該所有屬性/字段複製到一個新的對象:

public object Clone() 
{ 
    Card newCard = new Card(); 

    newCard.X = this.X; 
    // ... 

    return newCard; 
} 

,或者您可以使用MemberwiseClone()

public object Clone() 
{ 
    return MemberwiseClone(); 
} 

但是,讓您在克隆較少的控制處理。

0

我傾向於使用MemberwiseClone()的簡單的數據,然後執行ICloneable throghout,我已經需要克隆元素的層次結構,所以:

public class CRMLazyLoadPrefs : ICloneable 
{ 
    public bool Core { get; set; } 
    public bool Events { get; set; }  
    public bool SubCategories { get; set; } 
    public OrganisationLazyLoadPrefs { get; set; } 

    public object Clone() 
    { 
     CRMLazyLoadPrefs _prefs = new CRMLazyLoadPrefs(); 
     // firstly, shallow copy the booleans 
     _prefs = (CRMLazyLoadPrefs)this.MemberwiseClone(); 
     // then deep copy the other bits 
     _prefs.Organisation = (OrganisationLazyLoadPrefs)this.Organisation.Clone(); 
    } 
} 

凡OrganisationLazyLoadPrefs也實現ICloneable和等等等等。

希望這有助於 乾杯, 特里