C#中靜態變數的初始化
阿新 • • 發佈:2018-12-26
類的靜態欄位變數初始值設定項對應於一個賦值序列,這些賦值按照它們在相關的類宣告中出現的文字順序執行。如果類中存在靜態建構函式則靜態欄位初始值設定項的執行在該靜態建構函式即將執行前發生。否則,靜態欄位初始值設定項在第一次使用該類的靜態欄位之前先被執行,但實際執行時間依賴於具體的實現。在以下示例中:
using System;
class Test
{
staticvoid Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
publicstaticint F(string s) {
Console.WriteLine(s);
return1;
}
}
class A
{
publicstaticint X = Test.F("Init A");
}
class B
{
publicstaticint Y = Test.F("Init B");
} 或者產生如下輸出: Init A
Init B
1 1 或者產生如下輸出: Init B
Init A
1 1 這是因為 X 的初始值設定項和 Y 的初始值設定項的執行順序無法預先確定,上述兩種順序都有可能發生;唯一能夠確定的是:它們一定會在對那些欄位的引用之前發生。但是,下面的示例:
using System;
class Test
{
staticvoid Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
publicstaticint F(string s) {
Console.WriteLine(s);
return1;
}
}
class A
{
static A() {}
publicstaticint X = Test.F( "Init A");
}
class B
{
static B() {}
publicstaticint Y = Test.F("Init B");
}
所產生的輸出必然是: Init B
Init A
1 1 這是因為關於何時執行靜態建構函式的規則規定:B的靜態建構函式(以及B的靜態欄位初始值設定項)必須在A的靜態建構函式和欄位初始值設定項之前執行。
class Test
{
staticvoid Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
publicstaticint F(string s) {
Console.WriteLine(s);
return1;
}
}
class A
{
publicstaticint X = Test.F("Init A");
}
class B
{
publicstaticint Y = Test.F("Init B");
} 或者產生如下輸出: Init A
Init B
1 1 或者產生如下輸出: Init B
Init A
1 1 這是因為 X
class Test
{
staticvoid Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
publicstaticint F(string s) {
Console.WriteLine(s);
return1;
}
}
class A
{
static A() {}
publicstaticint X = Test.F(
}
class B
{
static B() {}
publicstaticint Y = Test.F("Init B");
}
所產生的輸出必然是: Init B
Init A
1 1 這是因為關於何時執行靜態建構函式的規則規定:B的靜態建構函式(以及B的靜態欄位初始值設定項)必須在A的靜態建構函式和欄位初始值設定項之前執行。