您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)CLR中靜態(tài)構(gòu)造函數(shù)如何使用,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(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(niǎo)的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)用一次!
以上就是CLR中靜態(tài)構(gòu)造函數(shù)如何使用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。