Собственность Getter запускается, и никто не называет это

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

  •  20-09-2019
  •  | 
  •  

Вопрос

Я работаю в .net 3.5. У меня есть класс "A", у которого есть стек и свойство Getter, которое при вызове удаляет первый элемент в стеке и получает следующий.

После инициализации класса я увидел, что Getter работает без вызванного, и удаляет верхний элемент в стеке, что дает мне плохие результаты. Точка останова в Геттере не показала никого, проходящего через это.

Когда я меняю свойство на функцию, стек возвращается ОК.

Я был бы счастлив, если бы кто -то мог объяснить, почему это так.

Вот упрощенный класс:

 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(); 
            };
        }            
    }
Это было полезно?

Решение

Во -первых, создание компенсации доклада о недвижимости, как правило, плохая идея. Наиболее наиболее он должен сделать, это лениво инициализировать что -то - или, возможно, дать летучую ценность (например, DateTime.Now делает).

Во -вторых, вы, вероятно, видите это, если вы работаете под отладчиком - он обращается к свойствам во время прохождения кода. Это, вероятно, объяснило бы, почему точка останова тоже не ударила.

Другие советы

Urls.Pop();

хочет быть

return Urls.Pop();

Как возвращает значение а также удаляет его из списка одновременно


На самом деле перечитав свой вопрос, похоже, что это потому, что отладчик оценивает свойства. Если вы запускаете приложение без отладчика, у вас есть такая же проблема?

Это плохой дизайн, я думаю. Доход GET не должен мутировать объект таким образом, чтобы выявлять разные результаты при последующих вызовах.

ИМО, проблема здесь заключается в том, что имеет свойство, которое имеет неочевидные побочные эффекты; Это должен быть метод:

    public string GetNextUrl() { /* */ }

В противном случае плохие вещи случаются везде (отладчик, связывание данных и т. Д.). Не думайте, что кто -то только один раз читает собственность.

Единственное разумное использование побочных эффектов в свойствах-это такие вещи, как ленивая загрузка, отложенная инициализация и т. Д. Она все равно должна сообщать о том же значении, когда вы называете последовательно без каких-либо других очевидных мутирующих вызовов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top