本來想寫乙個日誌類,初始化是獲取streamwriter,然後記錄日誌時write,flush,這樣可以避免重複開啟檔案,可是streamwriter莫名其妙變成null了,於是寫了乙個簡單的測試demo
using system;
using system.diagnostics;
using system.globalization;
using system.linq;
using system.text;
~tmp()
}class handle
public static tmp gettmp()
public static int geta()
~handle()
}class program
else
system.console.read();}}
}
輸出如下
main
handle construct
tmp construct
geta
t is null
system.console.read();生效前tmp的建構函式發生了,但是沒有經過析構函式就莫名其妙變成null,
handle的建構函式發生在main輸出之後,此輸出是handle的靜態變數h初始化時發生的,因為初始化是賦值為new handle();
tmp建構函式是在handle的建構函式中呼叫的,唯一賦值null的地方在初始化時,
於是得出以下結論:
1.靜態變數不是立即初始化,而是在第一次呼叫時初始化,因為main輸出在handle construct之前,
2.靜態變數按順序初始化,如上列印,handle construct在geta之前
3.靜態變數一次初始化所有,如上並沒有使用handle的靜態變數a,但是經過了a的初始化geta()
從以上三個結論可以再次推導出t為什麼是null,
handle的靜態變數初始化時,handle中將t也初始化了,
而第二個變數也就是t作為第二變數初始化為null,便與handle建構函式中的賦值衝突,將t又重置為null了
也就是說,變數還是一開始都在的,只是都是空的,並沒有初始化。這種情況下只需要把有使用其他變數的初始化函式放到最後面即可,或者乾脆全部賦值為null,0;然後在需要初始化的地方初始化
private static tmp t = null;
private static int a = geta();
private static handle h = new handle();
//private static handle h = null;
換個順序,t先被賦值為null,new handle()發生時,handle的建構函式中初始化時t被第二次賦值
於是輸出:
main
geta
handle construct
tmp construct
t not null
最好變數定義時全部賦值為空,null,0,然後統一再次賦值或修改,這樣就不會發生這種問題了,不過發生這種問題,然後把問題找出來也是個樂趣。 C 靜態變數問題
今天實現乙個函式的時候第一思路就是靜態變數 eg templateint puttreeinarray gtnode t1,elem a 而這個函式的目的是將乙個普通樹的結點值放入陣列中,並返回結點數,而我將在下面乙個函式呼叫這個函式兩次。eg templatebool isequaltree gt...
乙個類成員函式的區域性靜態變數問題
原文 當時遇到的需求需要這樣處理 呼叫某個類物件的某個成員函式時,第一次有具體意義的,其他時候都是保持不變的 無意義的。這個需求可以看做是在呼叫某成員函式時,第一次進行初始化,其他時候不進行操作,即在首次呼叫時進行初始化,根據這點,很容易想到c c 裡面的static變數,它的作用是保持變數內容的持...
關於 和靜態變數的乙個題
關於 和靜態變數的乙個題 count 是靜態變數,為所有物件共享,因此不管a.increment 還是b.increment 都會使count持續增加。increment 返回當前count值,然後count增加1,anotherincrement 方法讓count增加1,然後返回值。author ...