Question

Je ne suis pas sûr de la cause de l'exception StackOverflowException lorsque j'essaie d'écraser une fonction get et set. Quand je viens d'utiliser la valeur par défaut get and set cela fonctionne.

enum MyEnumType
{
....
}

public MyEnumType data { get; set; }

Mais lorsque j'essaie d'ajouter des données supplémentaires, une exception StackOverflowException est levée

public MyEnumType data 
{
  get
  {
    return data;
  }
  set 
  {
    data = value;
  }
}

Des idées? Lorsque je fais cela pour les attributs de contrôle utilisateur asp .net, il n'y a pas de problème. Je me demande pourquoi cela provoque une exception StackOverflowException pour un type de données enum normal.

Était-ce utile?

La solution

Oui, vous n'avez pas de champ de sauvegarde ... voici comment procéder:

 private MyEnumType data;

public MyEnumType Data 
{
  get
  {
    return data;
  }
  set 
  {
    data = value;
  }
}

Ce qui se passe, c'est que vous vous référez à la propriété pour qu'elle se retourne elle-même, cela provoque une boucle infinie d'essayer d'accéder à sa propre valeur. Par conséquent, StackOverFlow.

Dans votre cas, lorsque vous n’ajoutez aucune logique supplémentaire dans les méthodes get et set, vous pouvez également utiliser une propriété automatique. Ceci est simplement défini comme suit:

public MyEnumType Data 
{
  get;
  set;
}

Autres conseils

Vous faites référence à la propriété elle-même dans votre getter et votre setter, ce qui provoque une récursion infinie ( débordement de pile ). Cela aurait été plus évident si vous aviez utilisé les conventions de dénomination standard (Data).
Essayez quelque chose comme:

private MyEnumType _data;

public MyEnumType Data 
{
  get { return _data; }
  set { _data = value; }
}
public class MyClass
{
    string propertyString;

    public string MyPropertyString
    {
        get
        {
            return propertyString;
        }
        set
        {
            propertyString = value;
        }
    }
}

Le nom de la propriété doit être différent du nom du membre.

Placez un point d'arrêt à l'intérieur du setter / getter et du débogage, en vous assurant que vous utilisez step into (F11) et non pas step over - cela devrait aider à expliquer ce qui se passe.

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