Question

Je travaille en .net 3.5. J'ai une classe « A » qui a une pile et une propriété de lecture qui, lorsqu'il est appelé, supprime le premier élément de la pile et récupère la suivante.

Après l'initialisation de la classe, je vis que le getter fonctionne sans être appelé, et supprime l'élément supérieur de la pile, ce qui m'a donné de mauvais résultats. Un point d'arrêt dans le getter n'a pas montré tout le monde qui le traverse.

Quand je change la propriété à une fonction, la pile est renvoyée ok.

Je serais heureux si quelqu'un pourrait expliquer pourquoi est-ce.

Voici la classe simplifiée:

 public class A
    {
        private Stack<string> Urls;

        public A(string title, string[] array)
        {
            Urls = new Stack<string>();
            foreach (string s in array)
            {
                Urls.Push(s);
            }
        }

        public string Url
        {
            get { return Urls.Peek(); }
        }
        public string NextUrl
        {
            get{
            if (Urls.Count > 1)
                { Urls.Pop(); } 
            return Urls.Peek(); 
            };
        }            
    }
Était-ce utile?

La solution

Tout d'abord, faire un accesseur de propriété changer l'état est généralement une mauvaise idée. Le plus qu'il doit faire est quelque chose initialize paresseusement -. Ou peut-être donner une valeur volatile (comme DateTime.Now fait)

En second lieu, vous voyez probablement si vous êtes en cours d'exécution sous le débogueur - il accède à des propriétés pendant que vous faites un pas par le code. Ce serait sans doute expliquer pourquoi le point d'arrêt n'a pas été d'être frappé aussi.

Autres conseils

Urls.Pop();

veut être

return Urls.Pop();

car il renvoie la valeur et supprime de la liste en même temps


En fait, après avoir relu votre question, il semble que c'est parce que le débogueur évalue les propriétés. Si vous exécutez l'application sans le débogueur ne vous le même problème?

Ceci est une mauvaise conception, je pense. Un accesseur ne devrait pas muter l'objet d'une manière qui entraîne des résultats différents sur les appels suivants.

OMI, le problème ici est d'avoir une propriété qui a des effets secondaires non évidentes; cela devrait être une méthode:

    public string GetNextUrl() { /* */ }

Sinon, les mauvaises choses arrivent partout (le débogueur, liaison de données, etc.). Ne présumez pas que quelqu'un lit seulement une propriété une fois.

La seule utilisation judicieuse des effets secondaires dans les propriétés est des choses comme chargement paresseux, l'initialisation différée, etc. Il faut encore signaler la même valeur lorsqu'elle est appelée successivement sans autres appels évidents modificatrices.

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