3 votes

Pourquoi mon implémentation de get / set donne-t-elle une erreur de pile ?

J'essaie ce qui suit en C# :

public class Reference : AuditableTable
    {
        [Range(0, 99, ErrorMessage = "{0} must be between {1} and {2}")]
        [DisplayName("Order")]
        public int Order {
                get { return Order; }
                set {
                    if ((value < 0) || (value > 99)) {
                        throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
                    } else {
                        Order = value;
                    }
                }
            }

Quelqu'un peut-il m'expliquer pourquoi cela donne une erreur de dépassement de pile lors de la lecture ?

8voto

walther Points 7554

Votre propriété se réfère à elle-même, ce qui entraîne une boucle infinie.
Une solution évidente consiste à utiliser un champ privé et à l'exposer par le biais de votre propriété :

private int order;
public int Order
{
   get
   {
      return order; //private field
   }
   set
   {
      if ((value < 0) || (value > 99)) {
               throw new Exception(string.Format("{0} must be between 0 and 99",    
                                     value.ToString()));
      } else {
          order = value; // again accessing the private field (setting this time)
      }
   }
}

3voto

Smi Points 4856

Le problème est cette ligne :

get { return Order; }

Cela revient à appeler la propriété de manière récursive, ce qui entraîne un dépassement de pile.

1voto

Erno de Weerd Points 30391

Le setter et le getter se réfèrent tous deux à eux-mêmes, ce qui provoque le Stack Overflow. Corrigez-le comme ceci :

private int _order;

public int Order {
    get { return _order; }
    set {
        if ((value < 0) || (value > 99)) {
            throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
        } else {
            _order = value;
        }
    }
}

0voto

Aimeast Points 374
int _order;
public int Order {
    get { return _order; }
    set {
        if ((value < 0) || (value > 99)) {
            throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
        } else {
            _order = value;
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X