1. 程式人生 > >c#靜態變量賦值問題

c#靜態變量賦值問題

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#靜態變量賦值問題