为什么我的VS2008手表显示不正确的值?

问题描述:

我有一个字符串变量和一个字符串常量。两者应该是相同的价值(我在条件测试平等)。两者的“正确”值应该是“scl”。在调试的时候,如果我在每个地方都放一个手表,在'本地人'的窗口中查看它们,或者将鼠标悬停在它们上面,显示的值是“sd”,这是类中不同常量的值(还有很多其他常量和类中正在显示值的变量)。如果我为所讨论的变量/常数值插入一个Debug.WriteLine(与手表的范围相同),输出窗口会打印出每个值的正确值。对于我的生活,我无法弄清楚为什么会发生这种情况,或者如何纠正它。为什么我的VS2008手表显示不正确的值?

+0

你可能已经试过了,但我的第一个想法是,你有没有尝试重新启动VS? – 2010-06-28 18:46:54

+0

听起来像你需要清理和重建你的项目。一些调试信息听起来不对。 – 2010-06-28 18:47:04

+0

已经做到了。但谢谢你的建议。 – 2010-06-28 18:47:55

它是一个懒加载的属性?我在我做了这样的事情过去有问题,像这样的(可怕的人为的例子,但它会做)

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 
} 
+0

这是有道理的。然而,没有这样的事情正在完成。此外,其中一个错误值是不变的,所以将常数重新分配到合适的值是不可能的。 – 2010-06-28 19:16:14

我似乎通过改变常量的值已经固定它,跑一个调试会话,然后将其值改回原来的值。也许这清除了某种调试缓存。

感谢您的帮助!

+2

我想我知道发生了什么事。一个常量的语义应该是*值*常数* *永恒*。编译器假定即使在程序集版本之间,常数*从不*会发生变化。因此,当程序集B引用程序集A中的一个常量C时,编译器*会将C中的值嵌入到B中。如果您然后在A中更改常量,那么B仍然具有原始值,并且会一直重新编译B.如果希望该值是在运行时拾取的值,而不是使用属性或只读字段。 – 2010-06-28 20:50:20