【问题标题】:Why are my VS2008 watches showing incorrect values?为什么我的 VS2008 手表显示不正确的值?
【发布时间】:2010-06-29 03:38:06
【问题描述】:

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

【问题讨论】:

  • 你可能已经试过了,但我的第一个想法是,你试过重启VS吗?
  • 听起来你需要清理和重建你的项目。一些调试信息听起来不正常。
  • 两者都做了。不过谢谢你的建议。
  • 您是否使用优化 (/Ox) 进行编译?如果这样做,变量的值在调试器中并不总是最新的。

标签: c# visual-studio-2008 debugging watch


【解决方案1】:

我似乎已通过更改常量的值、运行调试会话、然后将值更改回应有的值来修复它。也许这清除了某种调试缓存。

感谢大家的帮助!

【讨论】:

  • 我想我知道发生了什么。常量的语义应该是 all eternity 的值是 constant。编译器假定常量从不 更改,即使在程序集的版本之间也是如此。因此,当程序集 B 引用程序集 A 中的常量 C 时,编译器将 C 的值嵌入到 B 中。如果您随后更改 A 中的常量,B 仍然具有原始值,直到您重新编译 B。如果您希望该值是在运行时获取的值,请改用属性或只读字段。
【解决方案2】:

它是一个延迟加载的属性吗?我过去曾遇到过类似的问题,我做过类似的事情(非常人为的例子,但它会做)

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
}

【讨论】:

  • 这是有道理的。但是,并没有这样做。此外,错误值之一是常数,因此无法将常数重新分配给正确的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多