靜態建構函式

2021-08-07 12:35:02 字數 1297 閱讀 2762

先看一道常見題目,以下**的執行結果是什麼?

classa}

class

b}

一、定義

由名稱可知,靜態建構函式(也稱為型別建構函式)包含「靜態」和「建構函式」兩個特點。第乙個特點決定了它與靜態函式類似,只能使用靜態成員;第二個特點決定了它與建構函式類似,具有初始化作用,並且沒有返回值。

與建構函式(針對例項物件)不同的是,靜態建構函式(針對類)只執行一次,並且是在第乙個例項物件建立前被呼叫,所以它可以用於那些只需要執行一次的操作;而且它不允許有public等修飾符,由程式自動呼叫,不能被外界呼叫。

總結:靜態建構函式用於初始化任何靜態資料,或者用於執行僅需執行一次的操作;在建立第乙個例項物件或者引用任何靜態變數之前,將自動呼叫靜態建構函式。

特點:1、靜態建構函式既沒有訪問修飾符,也沒有引數。

2、在建立第乙個例項或引用任何靜態成員之前,將自動呼叫靜態建構函式來初始化類。

3、無法直接呼叫靜態建構函式。  

4、在程式中,使用者無法控制何時執行靜態建構函式。

5、執行緒安全。

關於執行緒安全需要特別說明一下,由於程式可能在多執行緒環境下執行,也就是可能出現同時多個執行緒準備執行靜態建構函式的情況。clr確保這個過程是安全的,實際上呼叫靜態建構函式的執行緒需要先獲得乙個互斥執行緒同步鎖,如果有多個執行緒試圖執行型別的靜態建構函式,只有乙個執行緒能獲得該鎖;獲得鎖的執行緒完成初始型別初始化操作,其它執行緒只能等待;當初始化完成,等待的執行緒被喚醒,然後發現靜態建構函式已經被執行過,就不會再執行。

二、語法

public

class

statictester

}

三、作用

用於初始化靜態成員。有時候我們會從配置檔案讀取一些值作為靜態變數,類似這樣:  

public

class

statictester

}

如果要讀取的配置資訊比較多,而且要加入一些邏輯判斷,那麼可以這樣:

public

class

statictester

value"];

if (string

.isnullorempty(value))

}}  

四、執行順序

1. 執行時,優先對靜態變數進行初始化。

2. 如果有靜態建構函式,那麼在建立第乙個例項物件或者引用任何靜態變數之前,呼叫靜態建構函式。

3. 其它操作。

靜態建構函式

1 靜態建構函式既沒有訪問修飾符,也沒有引數。因為是.net呼叫的,所以像public和private等修飾符就沒有意義了。2 是在建立第乙個類例項或任何靜態成員被引用時,net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構函式了。3 乙個類...

靜態建構函式

1.類的建構函式有三種 例項建構函式,私有建構函式和靜態建構函式,靜態建構函式只能初始化靜態資料,或執行一次特殊的操作,這種函式只執行一次,在第一次建立類的物件的時候或者呼叫靜態成員時就會自動呼叫它,靜態建構函式沒有訪問修飾符,也沒有任何引數。可以參考一下下面的 using system using...

靜態建構函式

1 如果乙個類沒有定義靜態建構函式,就算它有靜態字段,編譯器也不會自動給這個類生成乙個預設的靜態建構函式。驗證如下 using system using system.collections.generic using system.text namespace teststaticconstruc...