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
注意:
當類第一次被加載時,會對類中的靜態變量先按順序進行分配內存空間,當全部分配完內存空間之后,在對靜態變量按順序賦值。
首先分為兩部分 寄存器和內存(包括緩存)
內存分為兩部分 代碼和數據
數據分為兩部分 靜態存儲區和運行時存儲
運行時存儲分為 堆棧 和 堆
靜態存儲分為 全局靜態存儲 和 常量