题
我的工作。净3.5.我有一个"A"级有一堆和一个吸气的财产,在所谓的,删除第一个项目的堆和检索下一个。
初始化后的类,我看到了,吸气的工作没有被称作,并删除顶项目的堆,因此给我坏的结果。一个断点在吸气没有表现出任何人通过它。
当我改变的酒店来一个函数,堆返回确定。
我很乐意,如果有人能解释为什么是这样。
这里是简化类:
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();
因为它返回的价值 和 将其从名单在同一时间
实际上具有重读你的问题,它看起来像这是因为调试评估的性质。如果运行的应用程序无需调试器你得到同样的问题?
这是糟糕的设计,我认为。一个获得访问者不应当改变对象的方式导致不同的结果在以后的话。
海事组织,这里的问题是有一个酒店有非显而易见的负面影响;这应该是一种方法:
public string GetNextUrl() { /* */ }
否则坏的事情发生到处(调试器,数据结合等)。不要假设,某人只读取财产的一次。
唯一明智使用的副作用性质的东西喜欢偷懒装、推迟初始化,等等。它应该仍然报告的同样价值时所谓顺序没有任何其他明显的变异的呼吁。
不隶属于 StackOverflow