趣談CLR中的靜態(tài)構(gòu)造函數(shù)
對于CLR中的靜態(tài)構(gòu)造函數(shù),我們將從簡單的概念開始講起,希望本文能對大家了解.NET中的靜態(tài)構(gòu)造函數(shù)有所幫助。
類的靜態(tài)構(gòu)造函數(shù)也叫類型構(gòu)造器,靜態(tài)構(gòu)造器,他調(diào)用的時刻由CLR來控制:
CLR會選擇如下時間之一來調(diào)用靜態(tài)構(gòu)造函數(shù):
1,在類型的***個實(shí)例創(chuàng)建之前,或類型的非繼承字段或成員***次訪問之前。這里的“之前”,代表前后銜接的意思。這里的時刻是精確的!
2,在非繼承的靜態(tài)字段或成員***次訪問之前的某個時刻,具體時刻不定!
由于調(diào)用的時刻不確定,所以我們***不要編寫依賴于特定的靜態(tài)構(gòu)造函數(shù)的執(zhí)行順序的代碼,這樣很容易產(chǎn)生不可預(yù)料的后果!
下面大家看三個Demo,我們來更加深入的看看靜態(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問B.strText需要調(diào)用B類的靜態(tài)構(gòu)造函數(shù)static B()。實(shí)際上輸出的結(jié)果是aaaa,因?yàn)閟trText是類A的靜態(tài)字段,而類B只是繼承了這個字段,所以這里會調(diào)用類A的靜態(tài)構(gòu)造函數(shù)static A(),所以輸出結(jié)果是aaaa。這也沒有什么真正可說的,相信大家都能看出這個結(jié)果的。
下面看看第二個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)為會輸出aaaa,理由是new B()之前會調(diào)用static B(),然后new A()之前需要調(diào)用static A,這樣結(jié)果是aaaa,但是實(shí)際情況并非如果,正確的結(jié)果是bbbb,原因如下:
在執(zhí)行new B(); 之前,B類的靜態(tài)構(gòu)造函數(shù)會調(diào)用,也就是會調(diào)用:
- static B()
- {
- strText="bbbb";
- }
當(dāng)執(zhí)行到strText=“bbbb"的時候,這時需要訪問strText字段,而B的strText字段是從A類繼承的,所以這里需要會先調(diào)用:
- static A()
- {
- strText="aaaa";
- }
執(zhí)行這個函數(shù)以后strText的值是aaaa
然后代碼又回到static B()中,這時才執(zhí)行static B()中的strText="bbbb"這行,所以strText這時的值是bbbb
當(dāng)執(zhí)行A a=new A();的時候,不會在調(diào)用A的靜態(tài)構(gòu)造函數(shù)了,因?yàn)榍懊嬉呀?jīng)調(diào)用過了,靜態(tài)函數(shù)在整個應(yīng)用程序域的生命周期中只會調(diào)用一次!
原文標(biāo)題:靜態(tài)構(gòu)造函數(shù)趣談!
鏈接:http://www.cnblogs.com/xuefeng1982/archive/2009/10/19/1585865.html
【編輯推薦】