代码改变世界

静态构造函数, 静态成员初始化/调用顺序

2017-06-04 17:10  Dirichlet  阅读(1361)  评论(0编辑  收藏  举报

1)第一次调用类的任何成员之前,执行静态成员的初始化动作,执行顺序是:静态成员初始化--->静态构造函数--->调用类的某成员(构造器,静态字段/属性/函数,)

2)在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。调用静态构造函数之前会先做静态成员的初始化。同1)。

如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。在应用程序域的生存期内,静态类一直保留在内存中。

总结:创建实例,引用/调用静态字段/函数会导致CLR 初始化静态成员和调用静态构造函数。只是获取type类型或者没有关于类的任何引用代码,静态成员的初始化和静态构造函数不会执行。

 

示例程序,main函数中分别打开TestCast1,2,3,4. 观察运行结果:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace static_const_readonly
{
    class MyClass
    {
        public static readonly int Count = 0;
        public static MyTest TEST = new MyTest();

        static MyClass()
        {
            Console.WriteLine("static MyClass() ctor.");
            TEST = new MyTest();
        }

        public static void FuncStatic()
        {
            Console.WriteLine("static void FuncStatic().");
        }

        public MyClass()
        {
            Console.WriteLine("MyClass() ctor");
        }
    }

    class MyTest
    {
        public MyTest()
        {
            Console.WriteLine("My Test ctor.");
        }
    }

    class Program
    {
         static void TestCast1()
        {
            Console.WriteLine("test starts.");
            MyClass myobject = new MyClass(); // call ctor
        }

         static void TestCast2()
         {
             Console.WriteLine("test starts.");
             Console.WriteLine("static MyClass.Count = {0}.", MyClass.Count); // get MyClass.Count
         }

        static void TestCast3()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
            Console.WriteLine(typeof(MyClass));
        }

        static void TestCast4()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
            MyClass.FuncStatic();
        }

        static void TestCast5()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
        }

        static void Main(string[] args)
        {
            //TestCast1();
            //TestCast2();
            //TestCast3();
            TestCast4();
            // TestCast5();
        }
    }
}

TestCase1结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
MyClass() ctor

TestCase2结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
static MyClass.Count = 0.

TestCase3结果:

test starts.
static_const_readonly.MyClass

TestCase4结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
static void FuncStatic().

TestCase5结果:

test starts.