C#靜態變量初始化實例詳解
C#靜態變量初始化是什么時候進行的呢?我們知道類的靜態字段變量初始值設定項對應于一個賦值序列,這些賦值按照它們在相關的類聲明中出現的文本順序執行。
對于C#靜態變量初始化,那么如果類中存在靜態構造函數則靜態字段初始值設定項的執行在該靜態構造函數即將執行前發生。否則,靜態字段初始值設定項在***次使用該類的靜態字段之前先被執行,但實際執行時間依賴于具體的實現。在以下示例中:
C#靜態變量初始化實例應用:
- 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的靜態構造函數和字段初始值設定項之前運行。
C#靜態變量初始化的基本情況就向你介紹到這里,希望對你了解和學習C#靜態變量初始化有所幫助。
【編輯推薦】