为什么我的VS2008手表显示不正确的值?
我有一个字符串变量和一个字符串常量。两者应该是相同的价值(我在条件测试平等)。两者的“正确”值应该是“scl”。在调试的时候,如果我在每个地方都放一个手表,在'本地人'的窗口中查看它们,或者将鼠标悬停在它们上面,显示的值是“sd”,这是类中不同常量的值(还有很多其他常量和类中正在显示值的变量)。如果我为所讨论的变量/常数值插入一个Debug.WriteLine(与手表的范围相同),输出窗口会打印出每个值的正确值。对于我的生活,我无法弄清楚为什么会发生这种情况,或者如何纠正它。为什么我的VS2008手表显示不正确的值?
它是一个懒加载的属性?我在我做了这样的事情过去有问题,像这样的(可怕的人为的例子,但它会做)
public ClassWithMoo
{
private string moo;
public string Moo
{
get
{
if (String.IsNullOrEmpty(this.moo)) this.moo = "Baa";
return this.moo;
}
set
{
this.moo = value;
}
}
}
public ClassThatUsesMoo
{
ClassWithMoo cow = new ClassWithMoo();
// breakpoint here would show cow.Moo = "Baa"
// This is because the debugger/watch window will instantiate the property!
someCodeHere();
cow.Moo = "Moo";
debug.WriteLine(cow.Moo); // outputs 'Moo' now that it has been set properly
}
这是有道理的。然而,没有这样的事情正在完成。此外,其中一个错误值是不变的,所以将常数重新分配到合适的值是不可能的。 – 2010-06-28 19:16:14
我似乎通过改变常量的值已经固定它,跑一个调试会话,然后将其值改回原来的值。也许这清除了某种调试缓存。
感谢您的帮助!
我想我知道发生了什么事。一个常量的语义应该是*值*常数* *永恒*。编译器假定即使在程序集版本之间,常数*从不*会发生变化。因此,当程序集B引用程序集A中的一个常量C时,编译器*会将C中的值嵌入到B中。如果您然后在A中更改常量,那么B仍然具有原始值,并且会一直重新编译B.如果希望该值是在运行时拾取的值,而不是使用属性或只读字段。 – 2010-06-28 20:50:20
你可能已经试过了,但我的第一个想法是,你有没有尝试重新启动VS? – 2010-06-28 18:46:54
听起来像你需要清理和重建你的项目。一些调试信息听起来不对。 – 2010-06-28 18:47:04
已经做到了。但谢谢你的建议。 – 2010-06-28 18:47:55