Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C堆栈溢出_C#_Stack Overflow_Icloneable - Fatal编程技术网

C# C堆栈溢出

C# C堆栈溢出,c#,stack-overflow,icloneable,C#,Stack Overflow,Icloneable,我试图找出为什么会出现堆栈溢出异常。我正在为学校作业创建一个简单的纸牌游戏,当我克隆纸牌返回时,会出现堆栈溢出异常 所以我得到了这张卡片: public class Card : ICloneable { .... #region ICloneable Members public object Clone() { return this.Clone(); // <--- here is the error thrown when the

我试图找出为什么会出现堆栈溢出异常。我正在为学校作业创建一个简单的纸牌游戏,当我克隆纸牌返回时,会出现堆栈溢出异常

所以我得到了这张卡片:

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
}
最后,我得到了列表的扩展方法:

在card类IClonable方法中抛出错误

CardLibrary.dll中发生类型为“System.StackOverflowException”的未处理异常


你称自己为:

public object Clone()
{
    return this.Clone();
}
这将导致无限递归

克隆方法应将所有属性/字段复制到新对象:

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

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

    return newCard;
}
或者你可以使用MemberwiseClone

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

但这会减少你对克隆过程的控制。

你称自己为:

public object Clone()
{
    return this.Clone();
}
这将导致无限递归

克隆方法应将所有属性/字段复制到新对象:

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

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

    return newCard;
}
或者你可以使用MemberwiseClone

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

但这会减少您对克隆过程的控制。

我倾向于对简单数据使用MemberwiseClone,然后通过需要克隆的元素层次结构实现iClonable,因此:

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();
    }
}
其中OrganizationLazyLoadPrefs还实现了iClonable等整个层次结构

希望这有帮助, 干杯
Terry

我倾向于对简单数据使用MemberwiseClone,然后通过我需要克隆的元素层次结构实现iClonable,因此:

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();
    }
}
其中OrganizationLazyLoadPrefs还实现了iClonable等整个层次结构

希望这有帮助, 干杯
Terry

卡是否需要可变,即它们是否具有可以更改的状态?如果没有,那么您可以只拥有一组不可变的卡片,可以在不同的集合中重复使用。无需克隆。请参阅关于ICloneable的讨论:在阅读了这个问题的标题后,我认为这属于meta-卡是否需要可变,即它们是否具有可以更改的状态?如果没有,那么您可以只拥有一组不可变的卡片,可以在不同的集合中重复使用。无需克隆。请参阅关于ICloneable的讨论:在阅读了这个问题的标题后,我认为这属于meta-+回答得好。无论何时使用MemberwiseClone,都不要忘记它只会创建一个浅层副本,即如果类字段是引用类型,则会复制引用,但不会复制引用对象。+1,回答得很好。无论何时使用MemberwiseClone,都不要忘记它只会创建一个浅层副本,即如果类字段是引用类型,则会复制引用,但不会复制引用对象。不过,刚才从@peterchen看到的注释,我们必须更详细地了解这一点——希望尽可能遵循最佳实践。不过,刚刚看到@peterchen的评论,我们必须更详细地了解这一点——希望尽可能遵循最佳实践。