C# 在调试所有对象创建、静态方法和构造函数的断点时,我看到了奇怪的控制流
这是我的节目:C# 在调试所有对象创建、静态方法和构造函数的断点时,我看到了奇怪的控制流,c#,asp.net,.net,c#-4.0,C#,Asp.net,.net,C# 4.0,这是我的节目: namespace ConsoleApplication3 { public class Program { public Program():this(20) { Console.WriteLine("Hi"); } private Program(int i) { Console.WriteLine(i.ToString());
namespace ConsoleApplication3
{
public class Program
{
public Program():this(20)
{
Console.WriteLine("Hi");
}
private Program(int i)
{
Console.WriteLine(i.ToString());
}
static Program()
{
int mess = 50;
Console.WriteLine("Static");
}
Program p = new Program();
static void Main(string[] args)
{
new Program(10);
Console.ReadLine();
}
}
}
我看到了,对程序的控制
- 静态构造函数
- 那么主要方法,
- 然后是"新计划(十)",
- 然后“程序p=新程序();”
- 然后是“公共程序():这(20)”
- 然后在最后两件事之间循环
新程序(10)
之后,它应该立即转到专用程序(inti)
,但它不会发生。奇怪private Program(int i)
{
// base ctor
base.ctor();
// field initializers
p = new Program();
// now comes the ctor body
Console.WriteLine(i.ToString());
}
p=new程序(…)
是堆栈溢出。每个新程序(使用任何构造函数)都希望在字段初始值设定项中创建新程序()。因为字段初始值设定项发生在构造函数主体之前,所以在堆栈爆炸之前,您看不到任何控制台.WriteLine
输出。首先,静态构造函数可以在JIT想要运行它的任何地方运行,只要它发生在创建实例或访问静态字段之前
对于实例构造函数:
字段初始值设定项在构造函数之前运行;基本上,它变成:
private Program(int i)
{
// base ctor
base.ctor();
// field initializers
p = new Program();
// now comes the ctor body
Console.WriteLine(i.ToString());
}
p=new程序(…)
是堆栈溢出。每个新程序(使用任何构造函数)都希望在字段初始值设定项中创建新程序()。因为字段初始值设定项发生在构造函数主体之前,所以在堆栈爆炸之前,您看不到任何控制台。WriteLine
输出。在创建第一个实例或引用任何静态成员之前,会自动调用。“我关心的从来不是为什么调用静态构造函数。”@Habib:顺便问一下,静态构造函数甚至在“命中静态主方法”之前都会被命中?从我的第一条评论中的链接中读到“用户无法控制在程序中何时执行静态构造函数。”“在创建第一个实例或引用任何静态成员之前自动调用。”我从来没有关注过“为什么调用静态构造函数”。@Habib:顺便问一下,在“命中静态主方法”之前,静态构造函数就会被命中?请阅读我第一条评论中的链接“用户无法控制在程序中何时执行静态构造函数”。谢谢,恐怕我没有完全听懂你的话,但我看到字段初始化是首先发生的,我部分同意你的观点,其他一些事情我不明白你在说什么。谢谢,我不知道,也不理解,也不同意你为什么要放base.ctor。我发现.NET有时不合逻辑。我是一名Microsoft开发人员,从未使用过任何其他技术。谢谢,恐怕我没有完全理解你的意思,但我看到字段初始化首先发生,我部分同意你的观点,其他事情我不明白你在说什么。谢谢,我不知道,也不理解,也不同意你为什么要放base.ctor。我发现.NET有时不合逻辑。我是一名微软开发人员,从未使用过任何其他技术。