静态构造函数, 静态成员初始化/调用顺序
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.