字段初始值设定项在 IL 的构造函数中,但在 Visual Studio 中调试时不存在

Field initializer is in constructor in IL, but not when debugging in Visual Studio

在 IL 代码中,字段初始化在构造函数中。

Field initialization in Constructor

但是在VS2017调试中,字段初始化不在构造函数中,而是在class。

Field initialization in 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();
    }
}

谁能给我解释一下?

这看起来不是问题。编译器将字段初始化移动到构造函数中,但调试信息会尝试尽可能接近 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 已经初始化。

您需要移动调试器的箭头(黄色的,不知道它叫什么名字)直到它越过

name = "22";