【C#基礎知識】靜態構造函數,來源於一道面試題的理解

 

看到園友的一道面試題,很好奇,測試了一下結果。面試

      public class A
        {
            public static int X=B.Y ;
            public A()
            {
               
                ++X;
            }
        }
        public class B
        {
            public static int Y = A.X ;
            static B()
            {              
                ++Y;                
            }
        }
        static void Main(string[] args)
        {                    
            
            Console.WriteLine(A.X.ToString());
            Console.WriteLine("B.Y");
            Console.WriteLine(B.Y.ToString());
            Console.Read();
        }

 

答案是:1 1函數

開始一直想不通,最後明白了,這道題考查的就是靜態構造函數。測試

 

  靜態構造函數:靜態構造函數是C#的一個新特性,其實好像不多用到。不過當咱們想初始化一些靜態變量的時候就須要用到它了。這個構造函數是屬於類的,而不是屬於哪裏實例的,就是說這個構造函數只會被執行一次。也就是在建立第一個實例或引用任何靜態成員以前,由.NET自動調用。spa

   當打印A.X.ToString()的時候:code

static int X = B.Y ,X因爲是全局變量,默認值仍是0;
執行B.Y ,由於Y是全局靜態成員,由於調用的是靜態成員就會執行靜態構造函數++Y,這時Y就是1了;
再賦值給X,因爲X沒有靜態構造函數,又沒有實例化是不會執行構造函數A的,因此打印結果X爲1。

當打印B.Y.toString()的時候:
static int Y = A.X,會查找到A的X,再執行一次上面的操做,可是因爲靜態構造函數只會執行一次,雖然調用了B的靜態成員,可是static構造函數中++Y就不會在執行了,X是1就會賦值給Y,因此Y打印結果也是1;


構造函數注意:
一、靜態構造函數既沒有訪問修飾符,也沒有參數。由於是.NET調用的,因此像public和private等修飾符就沒有意義了。

二、是在建立第一個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,也就是說咱們沒法直接調用靜態構造函數,也就沒法控制何時執行靜態構造函數了。

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

四、無參數的構造函數能夠與靜態構造函數共存。儘管參數列表相同,但一個屬於類,一個屬於實例,因此不會衝突。

五、最多隻運行一次。

六、靜態構造函數不能夠被繼承。

七、若是沒有寫靜態構造函數,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動生成默認的靜態構造函數。
答案是這樣解的嗎?求指教,求講解!!!
相關文章
相關標籤/搜索