趣谈CLR中的静态构造函数

开发 后端
在这里我们将谈谈CLR中的静态构造函数,类的静态构造函数也叫类型构造器,静态构造器。

对于CLR中的静态构造函数,我们将从简单的概念开始讲起,希望本文能对大家了解.NET中的静态构造函数有所帮助。

类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:

CLR会选择如下时间之一来调用静态构造函数:

1,在类型的***个实例创建之前,或类型的非继承字段或成员***次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!

2,在非继承的静态字段或成员***次访问之前的某个时刻,具体时刻不定!

由于调用的时刻不确定,所以我们***不要编写依赖于特定的静态构造函数的执行顺序的代码,这样很容易产生不可预料的后果!

下面大家看三个Demo,我们来更加深入的看看静态构造函数的一些有趣的行为:

  1. Demo1:  
  2.  
  3.  static void Main(string[] args)  
  4. {  
  5. Console.WriteLine(B.strText);  
  6. }  
  7. public class A  
  8. {  
  9. public static string strText;  
  10. static A()  
  11. {  
  12. strText = "aaaa";  
  13. }  
  14. }  
  15. public class B : A  
  16. {  
  17. static B()  
  18. {  
  19. strText = "bbbb";   
  20. }  

大家猜猜结果是什么,可能有人认为输出的是bbbb,因为访问B.strText需要调用B类的静态构造函数static B()。实际上输出的结果是aaaa,因为strText是类A的静态字段,而类B只是继承了这个字段,所以这里会调用类A的静态构造函数static A(),所以输出结果是aaaa。这也没有什么真正可说的,相信大家都能看出这个结果的。

下面看看第二个Demo:

  1. Demo2:  
  2.  
  3.  static void Main(string[] args)  
  4. {  
  5. B b = new B();  
  6. A a = new A();  
  7.  
  8. Console.WriteLine(B.strText);  
  9.  
  10. }  
  11. public class A  
  12. {  
  13. public static string strText;  
  14. static A()  
  15. {  
  16. strText = "aaaa";   
  17. }  
  18. }  
  19. public class B : A  
  20. {  
  21. static B()  
  22. {  
  23. strText = "bbbb";   
  24. }  

大家猜猜输出结果是什么,可能有人认为会输出aaaa,理由是new B()之前会调用static B(),然后new A()之前需要调用static A,这样结果是aaaa,但是实际情况并非如果,正确的结果是bbbb,原因如下:


在执行new B(); 之前,B类的静态构造函数会调用,也就是会调用:

  1. static B()  
  2. {  
  3.  strText="bbbb";  

当执行到strText=“bbbb"的时候,这时需要访问strText字段,而B的strText字段是从A类继承的,所以这里需要会先调用:

  1. static A()  
  2. {  
  3.  strText="aaaa";  
  4.  } 


执行这个函数以后strText的值是aaaa

然后代码又回到static B()中,这时才执行static B()中的strText="bbbb"这行,所以strText这时的值是bbbb

当执行A a=new A();的时候,不会在调用A的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!

原文标题:静态构造函数趣谈!

链接:http://www.cnblogs.com/xuefeng1982/archive/2009/10/19/1585865.html

【编辑推荐】

  1. 浅析C#数组操作方法
  2. C#数组操作全面分析
  3. C#数组和串操作经验总结
  4. 为你解疑:CLR是什么?
  5. 分析与对比CLR Via C#静态构造函数的性能
责任编辑:彭凡 来源: 安全中国网
相关推荐

2009-10-23 11:31:05

CLR Via C#调

2009-09-17 18:56:22

CLR Via C#

2009-09-18 09:02:45

CLR Via C#

2009-10-22 18:26:00

CLR集成性能

2009-07-31 15:37:45

C#静态构造函数

2009-08-20 14:28:00

C#静态构造函数

2009-07-31 15:44:02

C#静态构造函数

2010-01-27 16:10:32

C++静态构造函数

2009-08-13 18:02:11

C#静态构造函数

2010-01-22 11:13:16

C++静态

2010-02-01 11:01:30

C++静态构造函数

2009-08-13 18:10:31

C#静态构造函数

2011-06-11 21:36:44

C#C++

2011-06-14 12:27:38

C#C++

2009-11-17 09:07:55

静态构造函数

2009-07-31 16:06:50

成员函数构造函数C#

2010-01-27 17:16:52

C++构造函数

2010-07-16 17:04:38

Perl方法

2009-03-11 10:29:23

代码契约.NETCLR

2009-03-17 16:29:53

SQL ServerCLR.NET Framew
点赞
收藏

51CTO技术栈公众号