C 靜態建構函式

2021-04-25 17:17:20 字數 4241 閱讀 3675

c#

靜態建構函式

(duduhe譯)

簡介

.net c#

提供靜態建構函式功能,用以初始化靜態資料及執行某項特殊操作,該操作可能僅需執行一次。

靜態建構函式用如下格式來宣告:

static

classname()

以下任意情況發生時,靜態建構函式自動呼叫:

l類例項的建立。

l類的任意乙個靜態成員(屬性或方法)被呼叫。

用法

常常有這樣的情況:類庫的某些狀態值需要在使用該類庫前作初始化。靜態建構函式為解決這一

c#程式初始化問題提供了簡單明瞭的解決方法。

通常我們是在普通建構函式內作狀態初始化的。但是這樣做的問題是:普通建構函式是在用

new

關鍵字例項化乙個類時才呼叫的。當類包含功能性的靜態函式時,乙個靜態建構函式或者靜態字段可以確保所需狀態值在其他靜態方法呼叫前已經初始化過了。

同時也確保類的靜態建構函式在特定的程式域內至多執行一次。所以靜態建構函式也可以用來建立類的單一例項。這樣做有些效率問題,我們將在後文討論。

用內部靜態物件的例項來例項化資源

你可能會問,為什麼不在靜態成員宣告的時候為其初始化(賦值)呢?

用內部靜態物件的例項化來給常規的靜態字段

/資源賦值是完全可能的。

public

class

statictest

public

static

void

fun2(){}

}

這樣,如果要呼叫

fun1()

fun2()

,是假設「

rsr1

」在呼叫前已經初始化過了。靜態成員的確可以在其宣告時初始化,但是會有乙個靜態成員的值依賴於另乙個靜態成員的值的這種情況。

例如:如果乙個類標記為

beforefieldinit

那麼在函式呼叫時資源(靜態成員)就不會被初始化。根據

cli,

beforefieldinit

表明在呼叫型別的靜態函式時系統不會強制初始化型別。也就是說,靜態變數不會因為我們呼叫了靜態函式就進行初始化。但是

cli強調:只要有乙個靜態欄位被訪問,其他的靜態變數就會被初始化。這樣如果我們依賴某靜態成員的初始化,會消耗比較長的時間。

這種情況下,我們就需要某種特別的機制來處理有條件的靜態成員的初始化了。

c#提供了靜態建構函式來應對這種情況。

靜態建構函式是解決複雜問題的簡潔方法

public

class

statictest

public

static

void

fun1(){}

public

static

void

fun2(){}

}

這裡有個語言級保證就是:靜態建構函式會在其他靜態方法呼叫前被呼叫。也就是說保證了類的靜態變數的初始化是在任何靜態方法呼叫前進行的。

c#

語言中靜態建構函式相關要點:l

靜態建構函式在類的例項建立前執行。

l靜態建構函式在靜態成員被引用前執行。

l靜態建構函式在初始化靜態字段之後執行。

l靜態建構函式在乙個程式例項中至多執行一次。

l靜態建構函式沒有訪問許可權,也不能帶引數。

l在類的第乙個例項建立前或任一靜態成員被訪問前,靜態建構函式自動執行以初始化類。

l靜態建構函式不能被直接呼叫。

l使用者無法控制靜態建構函式在程式中的執行時機。

l靜態建構函式的乙個典型應用是:類使用日誌檔案,靜態建構函式被用於向該檔案寫資料。

應用靜態建構函式的單例模式:

靜態建構函式實現單態模式的方法在

c#下很簡單。是執行緒安全及延遲載入的。

public

sealed

class

singleton

singleton()

public

static

singleton instance

}

}

這個實現很簡單。把

instance

做成公有的靜態唯讀變數(

public

static

readonly

variable

)會更簡單。然而只有在一種情況我不會這麼實現:如果我想呼叫其他靜態函式而不觸發初始化,或者我想知道是否已經有個例項了。下面是這個問題的解決辦法:

public

sealed

class

singleton

public

static

singleton instance

} 

class

nested

internal

static

readonly

singleton instance =

newsingleton();

} 

}

這裡,例項化僅在第一次引用

nested class

的靜態成員時觸發,即在訪問

instance

時觸發。這樣的實現是完全延遲載入的方式,卻有著前面方法的好效率。注意,內部型別可以訪問外部型別的私有成員,但反之卻是不成立的,所以這裡的

instance

internal

的。儘管類本身是私有的,但這不會引起什麼問題。不過為了實現例項化的延遲,**變得複雜了一點。

泛型實現的單例模式

下面的例子說明了

.net

下優化的泛型的

singleton

類。這個例子稍加改動可以建立乙個泛型的單例工廠。下面是加入泛型特性後,實現執行緒安全及延遲載入的**:

public

static

class

singletonwhere t :

new()

} 

private

class

singletoninternal

internal

static

readonly

t instance =

newt();

} 

}

結論

靜態建構函式在

c#中是個簡單又重要的概念。它用於狀態及資源的初始化。

C 靜態建構函式

c 靜態建構函式 靜態建構函式是 c 的乙個新特性,在程式設計過程中用處並不廣,它的主要目的是用於初始化一些靜態的變數。因為這個建構函式是屬於類的,而不屬於任何乙個例項,所以這個建構函式只會被執行一次,而且是在建立此類的第乙個例項或引用任何靜態成員之前,由 net 自動呼叫。在程式中我們可以這樣寫 ...

c 靜態建構函式

c 靜態建構函式,又稱類建構函式。它是屬於類的,不屬於任何乙個類的例項。它具有以下特點 1 以static定義的,無訪問修飾符,無返回型別,無引數的建構函式,如 code class test 2 不能通過 顯式的呼叫靜態建構函式 3 靜態建構函式在類的靜態成員第一次訪問或第乙個類例項建立之前由系統...

C 靜態建構函式

對於c 靜態建構函式,很少在開發中使用,但的確是一種非常有用的開發方式。c 靜態建構函式的乙個重要原因是 類有一些靜態欄位或屬性,需要在第一次使用該類之前,從外部源中初始化這些靜態字段或者屬性。用下面的例子來說明靜態建構函式的使用 namespace staticconstructorsample ...