Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调试所有对象创建、静态方法和构造函数的断点时,我看到了奇怪的控制流_C#_Asp.net_.net_C# 4.0 - Fatal编程技术网

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)
    ,但它不会发生。奇怪

  • 我觉得在最后两个电话之间循环没有什么逻辑可言。如果我不得不省略上面的问题1,继续盲目地同意它的流程是正确的,我认为没有理由在上面提到的最后两个不相关的调用之间以这种方式循环

  • 没有逻辑我能理解

    首先,静态构造函数可以在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
    输出。

    首先,静态构造函数可以在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有时不合逻辑。我是一名微软开发人员,从未使用过任何其他技术。