调试时意外更改值类型

时间:2018-10-18 15:37:35

标签: debugging decimal

以下问题:我定义了一个简单的单元测试,该单元测试使用三个十进制输入参数执行一些基本计算。当我进入方法GetFxHedgeRelativeInPercentage时,一旦执行第一步,就会观察到参数xauForwardValuta的参数变化(请参见下面的屏幕截图)。

为什么会这样?参数xauForwardValuta是一个(不可变的)值类型,并且不应更改,因为它永远不会重新分配。有什么想法吗?

环境:VS2017(15.8.2)、. Net Framework 4.7,xUnit 2.4

[Fact]
public void TestMethod1()
{
    decimal fxHedgeAbsolute = -0.0107612378106512251880194424m;
    decimal totalForwardValue = -100170000.000000000000000m;
    decimal xauForwardValuta = 2202777.418898231m;

    var fxHedgeRelativeInPercentage = GetFxHedgeRelativeInPercentage(fxHedgeAbsolute, totalForwardValue, xauForwardValuta);


    this.testOutputHelper.WriteLine($"{fxHedgeRelativeInPercentage}");

    // -0.0000000105118158185915135200
}

调试步骤1: Debug step 1

观看第1步后 Watch after step 1

调试步骤2: Debug step 2

观看第二步: Watch after step 2

1 个答案:

答案 0 :(得分:1)

欢迎在优化领域中进行调试。这是编译器如何实现代码的产物,这不是真正的问题。 (除非您得到错误的答案)

正如您所指出的,xauForwardValuta永远不会重新分配,甚至在第一行之后也不会再次使用。因此,编译器发现可以将其存储的寄存器重用。并且确实将其用于xauForwardValuta * -1的中间计算。

如果您调试优化的代码,则经常会看到值发生变化甚至消失,因为唯一保存它们的寄存器被重用于其他用途。