http://blog.csdn.net/huangcailian/article/details/25958967
一、成员初始化整体顺序
1.成员赋值初始化先于构造函数;
2.成员赋值初始先从子类再到基类;
3.构造函数初始化先从基类再到子类;
4.静态成员初始化优先于实例成员初始化;
二、对类型静态成员构造的大致过程
1.分配静态成员的内存空间,此时空间存储数据为0;
2.执行类的静态成员的初始化语句;
3.执行类的静态构造函数。
三、对类型实例成员构造的大致过程
1.分配实例成员的内存空间,此时空间存储数据为0;
2.执行子类实例成员初始化语句;
3.执行基类实例化成员初始化语句;
4.执行基类构造函数;
5.执行子类构造函数;
四、同时有静态成员和实例成员的大致构造过程
1.执行子类静态成员初始化语句;
2.执行子类静态构造函数;
3.执行子类实例成员初始化语句;
4.执行基类静态成员初始化语句;
5.执行基类静态构造函数;
6.执行基类实例成员初始化语句;
7.执行基类实例构造函数;
8.执行子类实例构造函数。
五、说明
1.C#中静态构造函数都是私有的,不能为其添加访问修饰符;
2.只有创建类的实例或调用任何静态成员时才能激发静态构造函数;
3.调用一个未初始化类的静态成员时,他会先去初始化这个类的静态成员和静态构造函数。
using System; using System.Diagnostics; using System.Text; class Test { class CTEST { } class SINGLE_TON { public static float sfx = 1; //1 public static CTEST ot = new CTEST();//2 private float fx = 13; static private double dx = 100.03;//3 private string s = "hello"; //public static readonly SINGLE_TON Instance = new SINGLE_TON();//加上这句就比较特殊了,这里虽有构造操作,但必须等到所有成员初始完成后才会进行 public static int x;//22 public string str; protected int y = 123; public SINGLE_TON() { Console.WriteLine("private single_ton"); } //静态构造函数最会多只会被调用一次,在首次访问类的静态成员变量或生成类的实例时被调用。 static SINGLE_TON() { Console.WriteLine("static single_ton"); } public void dosth() { Console.WriteLine("do some thing"); } } static void Main() { //首次访问类的静态变量,编译器首先会对所有有初始值的静态变量进行赋值操作,如1和2,3处。 //然后调用静态构造函数。 //不会对非静态变量进行赋值。不过它们都有默认值,数值类型为0,引用类型为null int x = SINGLE_TON.x; // SINGLE_TON.Instance.dosth(); // SINGLE_TON.Instance.dosth(); // SINGLE_TON.Instance.dosth(); //生成类实例时,编译器首先会对所有有初始值的静态变量进行赋值操作,如1和2,3处。 //然后调用静态构造函数。 //然后才对有初始值的非静态变量进行赋值。 //然后调用普通构造函数。 SINGLE_TON sg = new SINGLE_TON(); } //输出结果: // private single_ton // static single_ton // do some thing // do some thing // do some thing }