为什么静态构造函数首先不被命中?

时间:2015-03-20 13:24:02

标签: c# .net constructor static

我有下面的代码,我只有两个简单的问题,这些问题在下面的程序行为中是正常的,我不幸不会看到:

  1. 任何类中的静态构造函数应该是第一个在命中静态字段后立即命中的构造函数。然后只有实例构造函数。但我所看到的是,调试首先进入公共构造函数。伤心的事。为什么?
  2. 虽然:程序的输出是:

      

    这是Staticcc ......

         

    1

    ......哪个是对的。

    1. 我在Static构造函数start中保留了一个断点,但是当我调试它时,它只在静态构造函数的结束括号中显示断点。为什么?
    2. 示例代码:

      public sealed class B  : A, C
      {
          public   int? m = 0;
          public B()
          {
              m = 1;
          }
          private B(int a, int b)
          {
              m = 2;
          }
          protected B(int x, int y, int z)
          {
              m = 3;
          }       
      
          static B()
          {
              Console.WriteLine("THis is staticcc");
          }
      
          public static B b = new B();
          public static B BC
          {
              get
              {
                  return b;
              }
          }
      
          static void Main()
          {           
              Console.WriteLine(B.BC.m);
              Console.ReadKey();
          }
      }
      
      public interface C
      {
      }
      
      public  class A 
      {
          //private A()
          //{
      
          //}       
      }
      

2 个答案:

答案 0 :(得分:5)

这是问题所在:

public static B b = new B();

静态字段初始值设定项在执行静态构造函数之前执行。从C#规范部分10.5.5.1:

  

如果类中存在静态构造函数(10.12),则在执行该静态构造函数之前立即执行静态字段初始值设定项。

您的静态字段初始化程序会调用您的实例构造函数,因此实例构造函数是第一个执行的东西。

  

虽然:程序的输出是This is Staticcc ...然后1 ......哪个是正确的。

是的,因为所有初始化都是评估B.BC.mMain的一部分。

如果您将Console.WriteLine("Instance Constructor");添加到构造函数中,您会看到:

Instance Constructor
THis is staticcc
1

如果这没有帮助,请将Main视为:

int tmp = B.BC.m;       // This prints initialization bits
Console.WriteLine(tmp); // This prints 1

答案 1 :(得分:1)

这是因为这一行在static构造函数之前运行:

public static B b = new B();

static构造函数中的第一行(您看不到的部分,但实际上在那里)实际上正在调用B的构造函数。这就是你没有看到static构造函数首先命中的原因。

如果你这样写,你会看到static构造函数首先命中:

static B()
{
    Console.WriteLine("THis is staticcc");

    b = new B();
}

public static B b;