using system;
namespace param
[stathread]
static void main(string args)
",i));
console.writeline(string.format("j=",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=",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的做法,但是我仍然很佩服出題的人。
c 類中static 型別變數使用
在c 語音中類的靜態資料成員在初始化時比較特殊,以為它並不是在類的定義中初始化,而是在類的定義外被初始化。如下示例 include iostream include string.h class test test char strname test char strname,int num cha...
C 類的 static變數
using system namespace teststatic static void main string args i console.writeline j new class1 j console.read 上面的 是乙個告訴我的,讓我看看結果,我看了一眼馬上說結果是 i 1 j 1 ...
類中static變數和成員變數
要理解標題,我們首先來看下static變數本身的特殊之處,即它儲存在全域性資料區。在類中的static變數也是如此。c 的記憶體分布 區 函式體的二進位制 全域性資料區 全域性變數和static變數 堆 動態記憶體分配 通過new 棧 區域性變數 常量區 字元 文字常量 這之後我們先通過 觀察一下區...