c#靜態變量賦值問題
阿新 • • 發佈:2018-01-05
urn color col pan 靜態變量 read clas ogr 和數
靜態存儲分為 全局靜態存儲 和 常量
class Program { static int i = getNum(); int j = getNum(); static int num = 1; static int getNum() { return num; } static void Main(string[] args) { Console.WriteLine("i={0}", i); Console.WriteLine("j={0}", new Program().j); Console.Read(); } }
//輸出值為
i=0
j=1
分析上面的代碼:
Console.WriteLine("i={0}", i);
這裏 i 是 static 變量,在類 Program 第一次被加載時,要先為 Program 裏面所有的 static 變量分配內存。盡管現在有超線程技術,但是指令在邏輯上還是逐條的按順序自上而下執行,所以 先為 static int i 分配內存,並且在該內存中保持int的缺省值0,接著再為 static int num 變量分配內存,值當然也為0。
然後第二步,為變量賦值:先為 static int i 變量賦值,i=getNum(),看 getNum() 裏面的代碼,就是return num,這個時候 num 的值是 0 ,於是 i=0 。然後對變量num賦值,num=1;這行代碼執行後,num就為1了。所以,j=1。
所以最後的結果為:
i=0 j=1
註意:
當類第一次被加載時,會對類中的靜態變量先按順序進行分配內存空間,當全部分配完內存空間之後,在對靜態變量按順序賦值。
首先分為兩部分 寄存器和內存(包括緩存)
內存分為兩部分 代碼和數據
數據分為兩部分 靜態存儲區和運行時存儲
運行時存儲分為 堆棧 和 堆
c#靜態變量賦值問題