代码之家  ›  专栏  ›  技术社区  ›  Vlad

在实例构造函数之后调用静态构造函数?

  •  16
  • Vlad  · 技术社区  · 14 年前

    亲爱的各位,像这样的问题 already asked ,但在这些答案中,我看不出对这个问题的解释。

    问题是 C# Programming Guide 说:

    静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。它在创建第一个实例或引用任何静态成员之前自动调用。

    特别是,在创建类的任何实例之前调用静态构造函数。(这不能确保静态构造函数在创建实例之前完成,但这是另一回事。)

    using System;
    
    public class Test
    {
        static public Test test = new Test();
        static Test()
        {
            Console.WriteLine("static Test()");
        }
        public Test()
        {
            Console.WriteLine("new Test()");
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Main() started");
            Console.WriteLine("Test.test = " + Test.test);
            Console.WriteLine("Main() finished");
        }
    }
    

    它输出:

    Main()已启动

    静态测试()
    Test.Test=测试
    Main()已完成

    之前 静态构造函数 开始 . 这和指南不矛盾吗?也许静态字段的初始化被认为是静态构造函数的隐式部分?

    1 回复  |  直到 7 年前
        1
  •  26
  •   SLaks    14 年前

    的内联初始值设定项 static 字段在显式 构造器。

    public class Test {
        .cctor {    //Class constructor
            Test.test = new Test();                //Inline field initializer
            Console.WriteLine("static Test()");    //Explicit static ctor
        }
        .ctor { ... }    //Instance constructor
    }
    

    请注意,这与声明顺序无关。

    引用 spec

    静态字段变量初始值设定项 对应于 它们出现的文本顺序 类声明。 构造器 (Section 10.11) 存在于 字段初始值设定项立即发生 在执行静态 构造器。