C# 類中靜態變量靜態構造函數執行順序


我們常常在網上看到說我們類中如果有靜態變量和靜態構造函數,那么先執行靜態變量,然后靜態函數。但是為什么呢?真的是這樣嗎?

 例子代碼:

public class BaseClass

 { public static int s1 = 10; static BaseClass() { s1 = 11; } }

static void Main(string[] args)
{
BaseClass.s1 = 5;
}

 
  

 

我們定義一個類並調用:我們都知道s1結果是 5;單點調試時

第一步:BaseClass.s1 = 5;

第二步: public static int s1 = 10;

第三步: s1 = 11;

這樣看說先執行先執行靜態變量,然后靜態函數 好像也沒問題。

我們通過IL言語發現其實不然:

 

 

 

.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// 代碼大小 16 (0x10)
.maxstack 8
IL_0000: ldc.i4.s 10
IL_0002: stsfld int32 ConsoleAppTest.BaseClass::s1
IL_0007: nop
IL_0008: ldc.i4.s 11
IL_000a: stsfld int32 ConsoleAppTest.BaseClass::s1
IL_000f: ret
} // end of method BaseClass::.cctor

發現了什么,構造函數中把對 s1 = 10;的賦值放到了構造函數中。

 

總結:運行時s1分配內存空間並賦默認值,然后執行構造函數,但是構造函數中靜態變量的賦值是有順序的。先賦值10再11

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM