Инициализатор поля находится в конструкторе в IL, но не при отладке в Visual Studio - PullRequest
0 голосов
/ 05 ноября 2018

В коде IL инициализация поля находится в конструкторе.

Инициализация поля в конструкторе

Но в отладке VS2017 инициализация поля не в конструкторе, а в классе.

Инициализация поля в VS Debug

Исходный код:

class A
{
    public int id = 0;
    public A()
    {
        id = 99;
    }
}

class B:A
{
    string name = "11";
    public B()
    {
        name = "22";
    }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
    }
}

Может кто-нибудь объяснить мне это?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вам нужно переместить стрелку вашего отладчика (желтую, idk, как ее зовут), пока она не пройдет

name = "22";
0 голосов
/ 05 ноября 2018

Это не похоже на проблему. Компилятор перемещает инициализации полей в конструктор, но отладочная информация старается максимально точно следовать коду C #.

Так что на самом деле ваш IL будет выглядеть примерно так:

class B:A
{
    string name;

    public B()
    {
        // hidden from debugger
        name = "11"

        // here's where the debugger is told the constructor starts
        name = "22";
    }
}

Вот почему ваша точка останова на public B() показывает, что name уже инициализирован.

...