静态构造函数, 静态成员初始化/调用顺序
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中静态方法,静态变量,静态初始化器,构造函数,属性初始化都是啥时候调用的? 它们的先后顺序。