掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
C#靜態(tài)變量初始化是什么時候進(jìn)行的呢?我們知道類的靜態(tài)字段變量初始值設(shè)定項(xiàng)對應(yīng)于一個賦值序列,這些賦值按照它們在相關(guān)的類聲明中出現(xiàn)的文本順序執(zhí)行。

對于C#靜態(tài)變量初始化,那么如果類中存在靜態(tài)構(gòu)造函數(shù)則靜態(tài)字段初始值設(shè)定項(xiàng)的執(zhí)行在該靜態(tài)構(gòu)造函數(shù)即將執(zhí)行前發(fā)生。否則,靜態(tài)字段初始值設(shè)定項(xiàng)在***次使用該類的靜態(tài)字段之前先被執(zhí)行,但實(shí)際執(zhí)行時間依賴于具體的實(shí)現(xiàn)。在以下示例中:
C#靜態(tài)變量初始化實(shí)例應(yīng)用:
- 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");
- }
或者產(chǎn)生如下輸出:
- Init A
- Init B
- 1 1
或者產(chǎn)生如下輸出:
- Init B
- Init A
- 1 1
這是因?yàn)?X 的初始值設(shè)定項(xiàng)和 Y 的初始值設(shè)定項(xiàng)的執(zhí)行順序無法預(yù)先確定,上述兩種順序都有可能發(fā)生;***能夠確定的是:它們一定會在對那些字段的引用之前發(fā)生。但是,下面的示例:
- 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");
- }
所產(chǎn)生的輸出必然是:
- Init B
- Init A
- 1 1
這是因?yàn)殛P(guān)于何時執(zhí)行靜態(tài)構(gòu)造函數(shù)的規(guī)則規(guī)定:B的靜態(tài)構(gòu)造函數(shù)(以及B的靜態(tài)字段初始值設(shè)定項(xiàng))必須在A的靜態(tài)構(gòu)造函數(shù)和字段初始值設(shè)定項(xiàng)之前運(yùn)行。
C#靜態(tài)變量初始化的基本情況就向你介紹到這里,希望對你了解和學(xué)習(xí)C#靜態(tài)變量初始化有所幫助。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流