Непреднамеренное изменение типов значений при отладке - PullRequest
0 голосов
/ 18 октября 2018

Следующая проблема: я определил простой модульный тест, который выполняет некоторые основные вычисления с тремя десятичными входными параметрами.Когда я вхожу в метод 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

Наблюдайте за шагом 2: Watch after step 2

1 Ответ

0 голосов
/ 18 октября 2018

Добро пожаловать в отладку в мире оптимизации.Это артефакт того, как компилятор реализовал ваш код, и он не должен быть реальной проблемой.(если вы не получили неправильный ответ)

Как вы указали, xauForwardValuta никогда не переназначается и даже не используется снова после первой строки.Таким образом, компилятор видит, что регистр, в котором он хранится, может быть использован повторно.И он повторно использует его для промежуточного вычисления xauForwardValuta * -1.

. Если вы отлаживаете оптимизированный код, вы часто будете видеть, как значения изменяются или даже исчезают, поскольку единственный регистр, который их содержал, повторно используется для чего-то другого.

...