我试图找出为什么我得到堆栈溢出异常。我正在为学校作业创建一个简单的纸牌游戏,当我克隆卡片以返回它们时,我得到了堆栈溢出异常。
所以我得到了这个卡片类:
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();
}
错误会被卡类(IClonable方法)抛出,
CardLibrary.dll中出现未处理的“System.StackOverflowException”类型异常
答案 0 :(得分: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();
}
但这样可以减少对克隆过程的控制。
答案 1 :(得分:0)
我倾向于使用MemberwiseClone()来处理简单数据,然后实现ICloneable,而不是我需要克隆的元素层次结构,所以:
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等等。
希望这有帮助, 干杯, 特里