对于CLR中的静态构造函数,我们将从简单的概念开始讲起,希望本文能对大家了解.NET中的静态构造函数有所帮助。
创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元清镇做网站,已为上家服务,为清镇各地企业和个人服务,联系电话:13518219792
类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由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的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!
网站题目:趣谈CLR中的静态构造函数
当前地址:http://www.mswzjz.cn/qtweb/news44/288394.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能