c# 静态对象构造函数的执行顺序

使用一段简单的代码说明这个问题:

 

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticVar { class Program { static void Main(string[] args) { Console.WriteLine("主函数开始执行"); //Common1.ObjB1.OutPutB(3); //例子1 //Common2.ObjA2.OutPutA(4); //Common3.ObjC = new MyClassC(); //例子2 //Common4.ObjD.OutPutD(); //例子3 Console.ReadLine(); } } //例子1 class Common1 { public static MyClassA ObjA1 = new MyClassA(1); public static MyClassB ObjB1= new MyClassB(1); } class Common2 { public static MyClassA ObjA2= new MyClassA(2); public static MyClassB ObjB2 = new MyClassB(2); } class MyClassA { public MyClassA(int A) { Console.WriteLine("A参数构造 {0}",A); } public void OutPutA(int A) { Console.WriteLine("A输出 {0}",A); } } class MyClassB { public MyClassB(int B) { Console.WriteLine("B参数构造 {0}",B); } public void OutPutB(int B) { Console.WriteLine("B输出 {0}",B); } } //例子2 class Common3 { public static MyClassC ObjC; } class MyClassC { public MyClassC() { Console.WriteLine("c构造"); } } //例子3 class Common4 { public static MyClassE ObjE = new MyClassE(); public static MyClassD ObjD = new MyClassD(); } class MyClassD { public MyClassD() { Console.WriteLine("D构造"); Common4.ObjE.OutPutE(); } public void OutPutD() { Console.WriteLine("D输出"); } } class MyClassE { public MyClassE() { Console.WriteLine("E构造"); } public void OutPutE() { Console.WriteLine("E输出"); } } }

(实验一)

1)如果去掉第14行Common1.ObjB1.OutPutB(3); 前面的注释,看一下程序的执行结果:

A参数构造 1
B参数构造 1
主函数开始执行
B输出 3

 

2)如果去掉第15行的Common2.ObjA2.OutPutA(4);前面的注释,看一下程序执行结果:

A参数构造 2
B参数构造 2
主函数开始执行
A输出 4

 

3)第14,15行注释都去掉,程序执行结果:

A参数构造 1
B参数构造 1
A参数构造 2
B参数构造 2
主函数开始执行
B输出 3
A输出 4

可以看到:

1)如果某个静态对象的构造是在Main()函数之外,而在Main()函数内使用了该对象,那么该对象的构造会发生在Main()函数执行之前

2)如果某个静态对象A在Main()函数之外的某个类B中被构造,而在Main()函数之中使用了A,那么在B中所有使用构造函数初始化的静态对象(无论他们在Main()函数中是否出现),他们会按照在B中出现的先后顺序被构造。

3)如果Main()之外的某个类A中定义了静态对象的构造,但是这些静态对象都没有在Main()函数中出现过,那么他们的构造函数不会被执行

4)如果静态对象A的构造出现在Main()函数之外的Common1类,静态对象B的构造出现在Main()之外的Common2类中,A和B先后出现在Main()函数之中,那么Common1和Common2中静态对象被构造的执行顺序是:先A后B,即与Main()函数中出现的顺序一致。

 

 

 

(实验二)

去掉第17行代码Common3.ObjC = new MyClassC();的注释,程序执行结果:

主函数开始执行
c构造

结论:静态成员在Main()函数之外的某个类中只给出定义,是不会在该类中被构造的。

 

 

(实验三)

去掉19行Common4.ObjD.OutPutD();的注释,程序执行结果如下:

E构造
D构造
E输出
主函数开始执行
D输出

但是,如果把class Common4中的88,89两行交换顺序,程序执行就会发生错误。原因如下:Main()函数中使用了静态对象ObjD,该对象的定义在类Common4当中,那么首先就要顺序执行Common4中给出了构造函数的静态成员的构造函数,交换后首先执行"public static MyClassD ObjD = new MyClassD();",在ObjD的构造函数中又会执行"Common4.ObjE.OutPutE();",但是这时候ObjE还没有被构造,要想使用它就要在它所在的Common4中按照给出构造函数的静态成员的先后顺序开始执行构造,那就要从ObjD开始,于是陷入了死循环了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值