標籤:檔案 互斥 建構函式 配置資訊 row 一個 直接 環境 初始化
一、定義
靜態建構函式是C#的一個新特性,其實好像很少用到。不過當我們想初始化一些靜態變數的時候就需要用到它了。這個建構函式是屬於類的,而不是屬於哪裡執行個體的,就是說這個建構函式只會被執行一次。也就是在建立第一個執行個體或引用任何靜態成員之前,由.NET自動調用。
class SimpleClass{// Static constructorstatic SimpleClass() {// }}
在使用靜態建構函式的時候應該注意幾點:
1、靜態建構函式既沒有存取修飾詞,也沒有參數。因為是.NET調用的,所以像public和private等修飾符就沒有意義了。
2、是在建立第一個類執行個體或任何靜態成員被引用時,.NET將自動調用靜態建構函式來初始化類,也就是說我們無法直接調用靜態建構函式,也就無法控制什麼時候執行靜態建構函式了。
3、一個類只能有一個靜態建構函式。
4、無參數的建構函式可以與靜態建構函式共存。儘管參數列表相同,但一個屬於類,一個屬於執行個體,所以不會衝突。
5、最多隻運行一次。
6、靜態建構函式不可以被繼承。
7、如果沒有寫靜態建構函式,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動產生預設的靜態建構函式。
8、安全執行緒
關於安全執行緒需要特別說明一下,由於程式可能在多線程環境下運行,也就是可能出現同時多個線程準備執行靜態建構函式的情況。CLR確保這個過程是安全的,實際上調用靜態建構函式的線程需要先獲得一個互斥線程同步鎖,如果有多個線程試圖執行類型的靜態建構函式,只有一個線程能獲得該鎖;獲得鎖的線程完成初始類型初始化操作,其它線程只能等待;當初始化完成,等待的線程被喚醒,然後發現靜態建構函式已經被執行過,就不會再執行。
二、作用
用於初始化靜態成員。有時候我們會從設定檔讀取一些值作為靜態變數,類似這樣:
public class StaticTester{private static readonly string key = ConfigurationManager.AppSettings["key"];private static readonly string value = ConfigurationManager.AppSettings["value"];static StaticTester(){ }} 如果要讀取的配置資訊比較多,而且要加入一些邏輯判斷,那麼可以這樣:
public class StaticTester{ private static readonly string key; private static readonly string value; static StaticTester() { key = ConfigurationManager.AppSettings["key"]; if (string.IsNullOrEmpty(key)) { throw new Exception("key變數未被正確配置!"); } value = ConfigurationManager.AppSettings["value"]; if (string.IsNullOrEmpty(value)) { throw new Exception("value變數未被正確配置!"); } }}
三、執行順序
1. 運行時,優先對靜態變數進行初始化。
2. 如果有靜態建構函式,那麼在建立第一個執行個體對象或者引用任何靜態變數之前,調用靜態建構函式。
3. 其它操作。
【轉自】https://www.cnblogs.com/4littleProgrammer/p/4883012.html
https://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html
【轉載】關於C#靜態建構函式的幾點說明