为什么不调用我的基类的静态构造函数?

时间:2013-11-20 09:38:19

标签: c# static-constructor

假设我有2个班级:

public abstract class Foo
{
    static Foo()
    {
        print("4");
    }
}

public class Bar : Foo
{
    static Bar()
    {
        print("2");
    }

    static void DoSomething()
    {
        /*...*/
    }
}

我希望在调用Bar.DoSomething()之后(假设这是我第一次访问Bar类),事件的顺序将是:

  1. Foo的静态构造函数(再次,假设第一次访问)>打印4
  2. Bar的静态构造函数>打印2
  3. 执行DoSomething
  4. 在底线,我希望打印42 测试后,似乎只打印2 And that is not even an answer

    你能解释一下这种行为吗?

2 个答案:

答案 0 :(得分:8)

规范声明:

  

类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

     
      
  1. 创建了一个类的实例。
  2.   
  3. 引用该类的任何静态成员。
  4.   

因为您没有引用基类的任何成员,所以构造函数不会被驱逐。

试试这个:

public abstract class Foo
{
    static Foo()
    {
        Console.Write("4");
    }

    protected internal static void Baz()
    {
        // I don't do anything but am called in inherited classes' 
        // constructors to call the Foo constructor
    }
}

public class Bar : Foo
{
    static Bar()
    {
        Foo.Baz();
        Console.Write("2");
    }

    public static void DoSomething()
    {
        /*...*/
    }
}

了解更多信息:

答案 1 :(得分:6)

未调用基类静态构造函数的原因是因为,我们还没有访问基类的任何静态成员,也没有提到派生类的实例。

根据文档,这些是调用静态构造函数的时间。

  

在创建第一个实例之前自动调用它   静态成员被引用。

在下面的代码中,当我们调用DoSomething时,将调用基类构造函数

   public abstract class Foo
    {
        static Foo()
        {
            Console.Write("4");
            j = 5;
        }

        protected static int j;

        public static void DoNothing()
        {

        }
    }

    public class Bar : Foo
    {
        static Bar()
        {
            Console.Write("2");
        }

        public static void DoSomething()
        {
            Console.Write(j);
        }
    }