Je reçois une erreur de StackOverflowException dans ma classe imbriquée sur la fonction ensemble de la propriété C #

StackOverflow https://stackoverflow.com/questions/4269755

  •  28-09-2019
  •  | 
  •  

Question

public class Class1
    {
        public Class1()
        {
            prop = new Class2();
        }
        public Class2 prop { get; set; }

        public class Class2
        {
            public Class2()
            {
                this.prop2 = "nikola";
            }

            public string prop2 { get { return prop2; } set { prop2 = EditString(value); } }

            public string EditString(string str)
            {
                str += " plavsic";
                return str;
            }
        }
    }

c'est mon code que j'ai un problème. Quand je tente d'objet Initialiser qui est le type de Class1 il renvoie une erreur de StackOverflowException. ce que je fais mal?

Était-ce utile?

La solution

PROP2 ensembles / retourne PROP2 ... qui appelle PROP2 pour obtenir / définir la valeur de PROP2, qui appelle PROP2 ... voir? Où cela est dirigé

Cela continue à se produire jusqu'à ce que l'ordinateur / exécution manque d'espace pour stocker la pile d'appels, et meurt.

Autres conseils

Votre propriété se fixe.

La prop2 = ... ligne dans le setter de propriété appelle le poseur de la propriété, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se demande à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se dit à nouveau, qui se demande à nouveau, qui se dit à nouveau ...

Le getter fait la même chose, sauf que vous appelez jamais.

Vous devez faire un champ de sauvegarde pour la propriété pour obtenir et définir.

Par exemple:

private string prop2; //Create a backing field
public string Prop2 {
    get { return prop2; }
    set { prop2 = EditString(value); }
}

Vous retournez prop2 dans le get, qui provoque le débordement de la pile (récursion infinie est mauvais).

Vous êtes dans une boucle infinie parce que vous définissez la propriété (prop2) à lui-même.

L'erreur est dans la définition de prop2. Les deux les méthodes get et set appellent simplement de nouveau dans la propriété prop2 et donc induire une récursion infinie.

public string prop2 { 
  get { return prop2; // <-- This just calls prop2 get again}
}

Vous devez ajouter un champ de support ici pour stocker la valeur de la propriété comme si

private string m_prop2;
public string prop2 { 
  get { return m_prop2; } 
  set { m_prop2 = EditString(value); } } 

Avez-vous regardé dans la pile d'appel lorsque l'exception est levée? Vous devriez voir une liste interminable d'appels au setter pour prop2.

Vous définissez la propriété à lui-même

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top