C#中靜態變數的何時初始化

來源:互聯網
上載者:User

引用自http://blog.csdn.net/dql1982/archive/2007/12/04/1916559.aspx

 

類的靜態欄位變數初始設定式對應於一個賦值序列,這些賦值按照它們在相關的類聲明中出現的文本順序執行。如果類中存在靜態建構函式則靜態欄位初始值設定項的執行在該靜態建構函式即將執行前發生。否則,靜態欄位初始值設定項在第一次使用該類的靜態欄位之前先被執行,但實際執行時間依賴於具體的實現。在以下樣本中:

using System;
class Test 
...{ 
static void Main() ...{
     Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) ...{
     Console.WriteLine(s);
     return 1;
}
}
class A
...{
public static int X = Test.F("Init A");
}
class B
...{
public static int Y = Test.F("Init B");
}或者產生如下輸出:Init A
Init B
1 1或者產生如下輸出:Init B
Init A
1 1這是因為 X 的初始值設定項和 Y 的初始值設定項的執行順序無法預先確定,上述兩種順序都有可能發生;唯一能夠確定的是:它們一定會在對那些欄位的引用之前發生。但是,下面的樣本: using System;
class Test
...{
static void Main() ...{
     Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) ...{
     Console.WriteLine(s);
     return 1;
}
}
class A
...{
static A() ...{}
public static int X = Test.F("Init A");
}
class B
...{
static B() ...{}
public static int Y = Test.F("Init B");
}
所產生的輸出必然是:Init B
Init A
1 1

  這是因為關於何時執行靜態建構函式的規則規定:B的靜態建構函式(以及B的靜態欄位初始值設定項)必須在A的靜態建構函式和欄位初始值設定項之前運行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.