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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态构造函数, 静态成员初始化/调用顺序相关的知识,希望对你有一定的参考价值。

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

2)静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化。同1).

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

4)如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。

5)在应用程序域的生存期内,静态类一直保留在内存中。

 

示例程序,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.

 

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

 

以上是关于静态构造函数, 静态成员初始化/调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

java中静态方法,静态变量,静态初始化器,构造函数,属性初始化都是啥时候调用的? 它们的先后顺序。

java中成员变量代码块构造函数运行顺序

实例构造函数与静态构造函数执行顺序

java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)

Java编程思想笔记-类的初始化顺序