1. 程式人生 > >【轉載】關於C#靜態構造函數的幾點說明

【轉載】關於C#靜態構造函數的幾點說明

rst ont row c const line lap 執行順序 pps 引用

一、定義

 靜態構造函數是C#的一個新特性,其實好像很少用到。不過當我們想初始化一些靜態變量的時候就需要用到它了。這個構造函數是屬於類的,而不是屬於哪裏實例的,就是說這個構造函數只會被執行一次。也就是在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。

class SimpleClass
{
// Static constructor
static 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#靜態構造函數的幾點說明