自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

趣談CLR中的靜態(tài)構(gòu)造函數(shù)

開發(fā) 后端
在這里我們將談?wù)凜LR中的靜態(tài)構(gòu)造函數(shù),類的靜態(tài)構(gòu)造函數(shù)也叫類型構(gòu)造器,靜態(tài)構(gòu)造器。

對于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ù)的一些有趣的行為:

  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é)果是什么,可能有人認(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:

  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é)果是什么,可能有人認(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)用:

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

當(dāng)執(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

當(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

【編輯推薦】

  1. 淺析C#數(shù)組操作方法
  2. C#數(shù)組操作全面分析
  3. C#數(shù)組和串操作經(jīng)驗(yàn)總結(jié)
  4. 為你解疑:CLR是什么?
  5. 分析與對比CLR Via C#靜態(tài)構(gòu)造函數(shù)的性能
責(zé)任編輯:彭凡 來源: 安全中國網(wǎng)
相關(guān)推薦

2009-10-23 11:31:05

CLR Via C#調(diào)

2009-09-17 18:56:22

CLR Via C#

2009-09-18 09:02:45

CLR Via C#

2009-10-22 18:26:00

CLR集成性能

2024-12-31 00:07:12

2009-07-31 15:44:02

C#靜態(tài)構(gòu)造函數(shù)

2009-07-31 15:37:45

C#靜態(tài)構(gòu)造函數(shù)

2009-08-20 14:28:00

C#靜態(tài)構(gòu)造函數(shù)

2010-01-22 11:13:16

C++靜態(tài)

2009-08-13 18:02:11

C#靜態(tài)構(gòu)造函數(shù)

2010-01-27 16:10:32

C++靜態(tài)構(gòu)造函數(shù)

2010-02-01 11:01:30

C++靜態(tài)構(gòu)造函數(shù)

2025-02-06 13:23:09

C++函數(shù)參數(shù)

2009-08-13 18:10:31

C#靜態(tài)構(gòu)造函數(shù)

2009-11-17 09:07:55

靜態(tài)構(gòu)造函數(shù)

2011-06-14 12:27:38

C#C++

2011-06-11 21:36:44

C#C++

2009-07-31 16:06:50

成員函數(shù)構(gòu)造函數(shù)C#

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-07-16 17:04:38

Perl方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號