static建構函式的用法和初始化順序

來源:互聯網
上載者:User

先看個例子:

using System;

Class A
{
 static int X;
 static A()
 {
  X = B.Y + 1;
 }
}

Class B
{
 public static int Y = A.X + 1;
 static B() {}
 
 static void Main()
 {
  Console.WriteLine("X={0},Y={1}",A.X,B.Y); 
  }

}

執行結果是X=1,Y=2

這個例子主要考查2個方面,一是static的用法,二是static的初始化順序。瞭解了static的初始化順序和規則,這個問題答答案就很容易理解了。這裡涉及到以下三類static對象:static成員,static方法,static建構函式。規則如下:

一個類的static建構函式在給定的應用程式定義域中僅執行一次。static建構函式由在應用程式定義域的下列事件的首次發生時觸發:
1)該類的執行個體被建立。
2)任何一個static成員被引用
3)如果類包含執行入口Main方法,此類的static建構函式在Main方法被調用之前執行。
4)如果類包含任何staic成員,則這些static成員在static建構函式之前進行初始化。
5)如果類包含任何static方法,則這些static方法在static建構函式之後進行初始化。
6)對於存在多個static成員,他們的初始化將按照文本順序進行,不會因為調用順序而改變。

現在看看上面的應用程式,Class B中有個Main執行入口,所以B首先得到初始化,順序是static成員Y->static建構函式。在初始化Y時,引用了A.X,編譯器又開始初始化Class A(注意這時Class B的初始化並沒有完成),順序也是static成員X->static建構函式。Class A中X在定義的時候沒有被賦予初始值(在定義static變數時,盡量賦予初始值),編譯器會預設賦予值0(int型)。然後再執行static的建構函式,由於Class B的初始化這時還沒有完成,所以B.Y的值在這時被編譯器賦予預設值0,所以在A的static的建構函式執行完後,X的值變為1,然後返回B繼續完成初始化,得到Y的值為2。最後執行Main,輸出A.X和B.Y的值。相反地,如果將B中的Main方法移出放在一個類C中,那執行結果又是什麼呢?依據以上的規則,可以很方便的得出答案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.