筆試題 關于類中static變量

作者: 月朗星稀  來源: 博客園  發布時間: 2009-10-21 14:30  閱讀: 1522 次  推薦: 0   原文鏈接   [收藏]  
using   System;  
namespace   Param  
{  
    class   Class1  
   {  
      static   int   i   =   getNum();  
      int   j   =   getNum();  
      static   int   num   =   1;  
      static   int   getNum()  
        {  
        return   num;  
          }  
     [STAThread]  
    static   void   Main(string[]   args)  
    {  
      Console.WriteLine(string.Format("i={0}",i));  
      Console.WriteLine(string.Format("j={0}",new   Class1().j));  
      Console.Read();
    }  
  }  
}   

  上面的代碼是一個網友告訴我的,讓我看看結果,我看了一眼馬上說結果是  
  i=1  
  j=1  
  網友運行后說結果是  
  i=0  
  j=1  
  我嚇了一跳,認真看了代碼,原來自己真的錯了。

  下面我解釋一下為什么是后一種結果:

  對一個類來說,static變量是與對象無關的,那么它們什么時候被初始化呢?就是在第一次引用的時候。當類生成對象的時候,可以簡單分成3步   

  1,為所有static變量分配內存,這個時候內存里面的值是該變量類型的缺省值。關于不同值類型的缺省值大家可以去查相關資料,注意值類型和引用類型是不同的。  
  2,為static變量賦值,同樣要注意值類型和引用類型是不同的。  
  3,生成對象,調用構造函數,先調用這個類的父類的構造函數,然后調用類本身的構造函數,生成對象。  
  現在分析上面的代碼:

  Console.WriteLine(string.Format("i={0}",i));這里i是static變量,而且類class1是第一次被引 用,按照上面說的三步,要先為class1里面所有的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了。分析到這里我就不繼續分析了,大 家很容易看出結果是什么。  
   
  稍微熟悉c#的人,只要認真看代碼,肯定不會出錯,但是如果拿來考人,相信很多人會做錯。我認為這個問題簡單得算不上一個技術問題,所以放在非技術區。之 所以在上面說那么多廢話來分析,是想說明在編程的時候,即使非常熟悉、非常基本的東西,也要認真。當然如果我手下的人寫出這樣的代碼,肯定在代碼檢視的時 候被我痛批。事實上對static   值類型變量不直接賦值,而通過方法來賦值,是不常用或者是有點bt的做法,但是我仍然很佩服出題的人。

0
0
 
標簽:static ASP.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()