記錄乙個C 靜態變數的問題

2021-09-25 11:59:23 字數 1620 閱讀 3572

本來想寫乙個日誌類,初始化是獲取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 ...