在观察窗口中覆盖的十进制变量

时间:2018-01-20 16:41:49

标签: c# decimal watch

我注意到参数a在观察窗口中评估为diff(即使b非零),当在break语句行上打破时,对我有意义。如果取消注释上面的行,那就不会发生。有任何想法吗?你们得到相同的结果吗?我使用Visual Studio Ultimate 2013 12.0.40629.00 Update 5,debug build。

public decimal Subtract(decimal a, decimal b)
{
    var diff = a - b;
    //var test = a;
    return diff;
}

1 个答案:

答案 0 :(得分:1)

  

因为这可能是编译器问题

取决于您对"问题"的定义。如果您正在调试优化的构建,那么您所看到的并不意外。 C#编译器不太可能合并变量存储(我猜不到它就是这样),但是JIT编译器,它创建了实际执行的本机代码,当然可以并且很可能会。

因此,在分配给diff后未使用的变量diff正在将其存储位置重用于变量{{1}},而不是为其分配全新的位置。

由于两个变量都使用相同的位置,因此当您在调试器中观察值时,更改一个变量会改变另一个变量。

有关调试优化版本的更多讨论,请参阅:

Cannot obtain value because it has been optimized away
What is the point of nop in CIL

第二个链接并不真正属于"重用变量槽"方面本身,但汉斯'答案确实包括句子"你仍然可以调试一个Release版本,但这是一个相当混乱的体验,让你怀疑你的理智" ,恕我直言总结了整个广泛的主题。 :)