溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

CLR中靜態(tài)構(gòu)造函數(shù)如何使用

發(fā)布時(shí)間:2021-07-14 14:37:04 來(lái)源:億速云 閱讀:112 作者:Leah 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

clr
AI