我注意到参数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;
}
答案 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版本,但这是一个相当混乱的体验,让你怀疑你的理智" ,恕我直言总结了整个广泛的主题。 :)