新聞中心
對(duì)于CLR中的靜態(tài)構(gòu)造函數(shù),我們將從簡(jiǎn)單的概念開(kāi)始講起,希望本文能對(duì)大家了解.NET中的靜態(tài)構(gòu)造函數(shù)有所幫助。

創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元清鎮(zhèn)做網(wǎng)站,已為上家服務(wù),為清鎮(zhèn)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
類的靜態(tài)構(gòu)造函數(shù)也叫類型構(gòu)造器,靜態(tài)構(gòu)造器,他調(diào)用的時(shí)刻由CLR來(lái)控制:
CLR會(huì)選擇如下時(shí)間之一來(lái)調(diào)用靜態(tài)構(gòu)造函數(shù):
1,在類型的***個(gè)實(shí)例創(chuàng)建之前,或類型的非繼承字段或成員***次訪問(wèn)之前。這里的“之前”,代表前后銜接的意思。這里的時(shí)刻是精確的!
2,在非繼承的靜態(tài)字段或成員***次訪問(wèn)之前的某個(gè)時(shí)刻,具體時(shí)刻不定!
由于調(diào)用的時(shí)刻不確定,所以我們***不要編寫依賴于特定的靜態(tài)構(gòu)造函數(shù)的執(zhí)行順序的代碼,這樣很容易產(chǎn)生不可預(yù)料的后果!
下面大家看三個(gè)Demo,我們來(lái)更加深入的看看靜態(tài)構(gòu)造函數(shù)的一些有趣的行為:
- 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";
- }
- }
大家猜猜結(jié)果是什么,可能有人認(rèn)為輸出的是bbbb,因?yàn)樵L問(wèn)B.strText需要調(diào)用B類的靜態(tài)構(gòu)造函數(shù)static B()。實(shí)際上輸出的結(jié)果是aaaa,因?yàn)閟trText是類A的靜態(tài)字段,而類B只是繼承了這個(gè)字段,所以這里會(huì)調(diào)用類A的靜態(tài)構(gòu)造函數(shù)static A(),所以輸出結(jié)果是aaaa。這也沒(méi)有什么真正可說(shuō)的,相信大家都能看出這個(gè)結(jié)果的。
下面看看第二個(gè)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";
- }
- }
大家猜猜輸出結(jié)果是什么,可能有人認(rèn)為會(huì)輸出aaaa,理由是new B()之前會(huì)調(diào)用static B(),然后new A()之前需要調(diào)用static A,這樣結(jié)果是aaaa,但是實(shí)際情況并非如果,正確的結(jié)果是bbbb,原因如下:
在執(zhí)行new B(); 之前,B類的靜態(tài)構(gòu)造函數(shù)會(huì)調(diào)用,也就是會(huì)調(diào)用:
- static B()
- {
- strText="bbbb";
- }
當(dāng)執(zhí)行到strText=“bbbb"的時(shí)候,這時(shí)需要訪問(wèn)strText字段,而B的strText字段是從A類繼承的,所以這里需要會(huì)先調(diào)用:
- static A()
- {
- strText="aaaa";
- }
執(zhí)行這個(gè)函數(shù)以后strText的值是aaaa
然后代碼又回到static B()中,這時(shí)才執(zhí)行static B()中的strText="bbbb"這行,所以strText這時(shí)的值是bbbb
當(dāng)執(zhí)行A a=new A();的時(shí)候,不會(huì)在調(diào)用A的靜態(tài)構(gòu)造函數(shù)了,因?yàn)榍懊嬉呀?jīng)調(diào)用過(guò)了,靜態(tài)函數(shù)在整個(gè)應(yīng)用程序域的生命周期中只會(huì)調(diào)用一次!
網(wǎng)站標(biāo)題:趣談CLR中的靜態(tài)構(gòu)造函數(shù)
分享鏈接:http://fisionsoft.com.cn/article/dhohdoe.html


咨詢
建站咨詢
