主要作用是:設置類型中靜態字段的初始化。類型構造器不一定要在類中定義,但是最多也只能有一個。例:
代碼如下:
class SomeType{
static SomeType(){}
}
jit編譯器在編譯一個方法時,會查看代碼引用哪些類型。任何類型定義了類型構造器,jit編譯器都會檢查當前AppDomain是否已經執行了這個類型構造器,如果沒有就執行,已經執行了就直接返回,不再次執行。在多線程的環境下,可能同一時間有多個執行相同的方法,CLR希望每一個AppDomain中一個類型構造器只執行一次,在調用類型構造器時,使用互斥線程同步鎖,解決這個問題。
類型構造器中只能訪問類型的靜態字段,一般只是初始化這些字段。
代碼內聯初始化字段:
代碼如下:
class SomeType
{
Static int x = 5;
}
等價於
代碼如下:
class SomeType
{
Static int x;
Static SomeType()
{
x = 5;
}
}
還有:
代碼如下:
class SomeType
{
Static int x = 3;
Static SomeType()
{
x = 5;
}
}
等價於
代碼如下:
class SomeType
{
Static int x;
Static SomeType()
{
x = 3;
x = 5;
}
}
雖然c#不允許值類型為它的實例化字段使用內聯初始化語法,但是靜態字段可以的,以上把class改成struct一樣可以運行,
主要原因是:值類型可以定義無參類型構造器,但是不可以定義無參類型實例構造器。