Frage

Ich versuche, herauszufinden, warum ich einen Stapelüberlauf Ausnahme bin immer. Ich bin ein einfaches Kartenspiel für eine Schulaufgabe zu schaffen, und wenn ich die Karten klonen sie zurückkehren ich den Stack-Überlauf Ausnahme erhalten.

Also habe ich diese Karte Klasse bekam:

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
}

, und ich habe eine Klasse namens Hand, die dann die Karten klonen:

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

Zuletzt, ich habe eine Erweiterungsmethode für die List:

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

Der Fehler in der Karte Klasse (IClonable Methode) geworfen wird,

  

Eine nicht behandelte Ausnahme des Typs 'System.StackOverflowException' aufgetreten in CardLibrary.dll

War es hilfreich?

Lösung

Du nennst dich:

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

Dies führt zu einer Endlosschleife.

Ihre Clone () -Methode sollte alle Eigenschaften / Felder auf ein neues Objekt kopieren:

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

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

    return newCard;
}

oder Sie können verwenden MemberwiseClone ()

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

Aber das gibt Ihnen weniger Kontrolle über das Klonen Prozess.

Andere Tipps

Ich habe eher MemberwiseClone () für die einfachen Daten zu verwenden, und dann ICloneable throghout der Hierarchie der Elemente realisiert, dass ich Klon gebraucht habe, so:

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();
    }
}

Wo OrganisationLazyLoadPrefs auch ICloneable implementiert und so weiter und so fort in der gesamten Hierarchie.

Hope, das hilft, Prost, Terry

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top