日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
趣談CLR中的靜態(tài)構(gòu)造函數(shù)

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

創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站設計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元清鎮(zhèn)做網(wǎng)站,已為上家服務,為清鎮(zhèn)各地企業(yè)和個人服務,聯(lián)系電話:13518219792

類的靜態(tài)構(gòu)造函數(shù)也叫類型構(gòu)造器,靜態(tài)構(gòu)造器,他調(diào)用的時刻由CLR來控制:

CLR會選擇如下時間之一來調(diào)用靜態(tài)構(gòu)造函數(shù):

1,在類型的***個實例創(chuàng)建之前,或類型的非繼承字段或成員***次訪問之前。這里的“之前”,代表前后銜接的意思。這里的時刻是精確的!

2,在非繼承的靜態(tài)字段或成員***次訪問之前的某個時刻,具體時刻不定!

由于調(diào)用的時刻不確定,所以我們***不要編寫依賴于特定的靜態(tài)構(gòu)造函數(shù)的執(zhí)行順序的代碼,這樣很容易產(chǎn)生不可預料的后果!

下面大家看三個Demo,我們來更加深入的看看靜態(tài)構(gòu)造函數(shù)的一些有趣的行為:

 
 
 
  1. Demo1:  
  2.  
  3.  static void Main(string[] args)  
  4. {  
  5. Console.WriteLine(B.strText);  
  6. }  
  7. public class A  
  8. {  
  9. public static string strText;  
  10. static A()  
  11. {  
  12. strText = "aaaa";  
  13. }  
  14. }  
  15. public class B : A  
  16. {  
  17. static B()  
  18. {  
  19. strText = "bbbb";   
  20. }  

大家猜猜結(jié)果是什么,可能有人認為輸出的是bbbb,因為訪問B.strText需要調(diào)用B類的靜態(tài)構(gòu)造函數(shù)static B()。實際上輸出的結(jié)果是aaaa,因為strText是類A的靜態(tài)字段,而類B只是繼承了這個字段,所以這里會調(diào)用類A的靜態(tài)構(gòu)造函數(shù)static A(),所以輸出結(jié)果是aaaa。這也沒有什么真正可說的,相信大家都能看出這個結(jié)果的。

下面看看第二個Demo:

 
 
 
  1. Demo2:  
  2.  
  3.  static void Main(string[] args)  
  4. {  
  5. B b = new B();  
  6. A a = new A();  
  7.  
  8. Console.WriteLine(B.strText);  
  9.  
  10. }  
  11. public class A  
  12. {  
  13. public static string strText;  
  14. static A()  
  15. {  
  16. strText = "aaaa";   
  17. }  
  18. }  
  19. public class B : A  
  20. {  
  21. static B()  
  22. {  
  23. strText = "bbbb";   
  24. }  

大家猜猜輸出結(jié)果是什么,可能有人認為會輸出aaaa,理由是new B()之前會調(diào)用static B(),然后new A()之前需要調(diào)用static A,這樣結(jié)果是aaaa,但是實際情況并非如果,正確的結(jié)果是bbbb,原因如下:

在執(zhí)行new B(); 之前,B類的靜態(tài)構(gòu)造函數(shù)會調(diào)用,也就是會調(diào)用:

 
 
 
  1. static B()  
  2. {  
  3.  strText="bbbb";  

當執(zhí)行到strText=“bbbb"的時候,這時需要訪問strText字段,而B的strText字段是從A類繼承的,所以這里需要會先調(diào)用:

 
 
 
  1. static A()  
  2. {  
  3.  strText="aaaa";  
  4.  } 

執(zhí)行這個函數(shù)以后strText的值是aaaa

然后代碼又回到static B()中,這時才執(zhí)行static B()中的strText="bbbb"這行,所以strText這時的值是bbbb

當執(zhí)行A a=new A();的時候,不會在調(diào)用A的靜態(tài)構(gòu)造函數(shù)了,因為前面已經(jīng)調(diào)用過了,靜態(tài)函數(shù)在整個應用程序域的生命周期中只會調(diào)用一次!


網(wǎng)頁名稱:趣談CLR中的靜態(tài)構(gòu)造函數(shù)
當前URL:http://m.5511xx.com/article/dhohdoe.html