字段初始值设定项在 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";
在 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";