Собственность Getter запускается, и никто не называет это
Вопрос
Я работаю в .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() { /* */ }
В противном случае плохие вещи случаются везде (отладчик, связывание данных и т. Д.). Не думайте, что кто -то только один раз читает собственность.
Единственное разумное использование побочных эффектов в свойствах-это такие вещи, как ленивая загрузка, отложенная инициализация и т. Д. Она все равно должна сообщать о том же значении, когда вы называете последовательно без каких-либо других очевидных мутирующих вызовов.