首页 > 静态构造函数趣谈!

静态构造函数趣谈!

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

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

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

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

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

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

Demo1:

         static void Main(string[] args)

        {

            Console.WriteLine(B.strText); 

        }

        public class A

        {

            public static string strText;

            static A()

            {

                strText = "aaaa"; 

            }

        }

        public class B : A

        {

            static B()

            {

                strText = "bbbb";  

            }

        }

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

下面看看第二个Demo:

Demo2:

         static void Main(string[] args)

        {

            B b = new B(); 

            A a = new A();



            Console.WriteLine(B.strText); 



        }

        public class A

        {

            public static string strText;

            static A()

            {

                strText = "aaaa";  

            }

        }

        public class B : A

        {

            static B()

            {

                strText = "bbbb";  

            }

        }

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

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

    static B()

    {

         strText="bbbb";

    }



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

    static A()

    {

         strText="aaaa";

     }

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

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

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

     请大家多指教啊!

转载于:https://www.cnblogs.com/xuefeng1982/archive/2009/10/19/1585865.html

更多相关:

  • jdt可以做语法树分析,并且支持visitor模式对代码进行分析。跟pmd的分析方式一样,我们只要实现 visitor接口即可实现一个插件。 @Service("requestMappingInfoService")public class RequestMappingInfoServiceImpl implements Reques...

  • 1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法。  (2)它们只能访问static数据。 (3)它们不能以任何方式引用this 或super。 class Simple {static v...

  • 2019独角兽企业重金招聘Python工程师标准>>> django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS STATIC_URL 好理解,就是映射到静态文件的url,一般为/static/ STATICFILES...

  • 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn、负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案。 至于从数据库角度的性能方案、虫子另开博文。 1. 首推静态化 推荐指数五颗星 满星五颗 只要是大型互联网应用基本上离不开这个概念,IIS自带的伪静态化不谈,但是想做好...