說說C#靜態變量的詭異與惡心


發現一段很詭異的C#代碼,見識了靜態構造函數這種奇怪的東西: 

C#代碼   收藏代碼
  1. using System;  
  2.   
  3. namespace StaticTest  
  4. {  
  5.     class A  
  6.     {  
  7.         public static int X;  
  8.         static A()  
  9.         {  
  10.             X = B.Y + 1;  
  11.         }  
  12.     }  
  13.     class B  
  14.     {  
  15.         public static int Y = A.X + 1;  
  16.         static B()  
  17.         {  
  18.         }  
  19.         static void Main()  
  20.         {  
  21.             Console.WriteLine("X={0}, Y={1}", A.X, B.Y);  
  22.         }  
  23.     }  
  24. }  



先補習下吧: 

  1、靜態構造函數既沒有訪問修飾符,也沒有參數。因為是.NET調用的,所以像public和private等修飾符就沒有意義了。 
   
  2、是在創建第一個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,也就是說我們無法直接調用靜態構造函數,也就無法控制什么時候執行靜態構造函數了。 

  3、一個類只能有一個靜態構造函數。 

  4、無參數的構造函數可以與靜態構造函數共存。盡管參數列表相同,但一個屬於類,一個屬於實例,所以不會沖突。 

  5、最多只運行一次。 

  6、靜態構造函數不可以被繼承。 

  7、如果沒有寫靜態構造函數,而類中包含帶有初始值設定的靜態成員,那么編譯器會自動生成默認的靜態構造函數。 

好,復習完畢,哪位同學回答下上面程序的輸出結果是多少? 

還是搞不明白吧:) 唔,你明白了?他沒明白,我也沒明白…… 

class A靜態構造函數中的B.Y好像很奇怪,貌似要確定A.X的值,得先確定B.Y的值,而B.Y的值在B中卻是由A.X來確定的,那A.X的值……啊,要瘋掉了……應該是多少呢?不敢確定了吧,交給編譯器來運行看看吧~~ 
結果如下: 

Java代碼   收藏代碼
  1. X=1, Y=2  



修改下代碼,看看內部到底怎么運行的: 

C#代碼   收藏代碼
  1. using System;  
  2.   
  3. namespace StaticTest  
  4. {  
  5.     class A  
  6.     {  
  7.         public static int X;  
  8.         static A()  
  9.         {  
  10.             Console.WriteLine("calling A");  
  11.             Console.WriteLine(B.Y);  
  12.             X = B.Y + 1;  
  13.         }  
  14.     }  
  15.     class B  
  16.     {  
  17.         public static int Y = A.X + 1;  
  18.         static B()  
  19.         {  
  20.             Console.WriteLine("calling B");  
  21.             Console.WriteLine(Y);  
  22.         }  
  23.         static void Main()  
  24.         {  
  25.             Console.WriteLine("X={0}, Y={1}", A.X, B.Y);  
  26.         }  
  27.     }  
  28. }  


執行結果如下: 

Java代碼   收藏代碼
  1. calling A  
  2. 0  
  3. calling B  
  4. 2  
  5. X=1, Y=2  


看到這個結果,對C#更加迷惑了。類A中靜態構造函數調用得到的B.Y,居然是0。這是什么道理?難道這個時候B還沒出生,但是B.Y已經出生了?不管了,先接受了吧,以后玩C#還是小心點了。哪位神仙指點指點迷津啊? 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM