型別構造器

2021-04-14 00:19:24 字數 1456 閱讀 9324

記得我在分析

readonly

關鍵字那篇文字裡,我用到了型別構造器。後來想了想,我能不能不用型別構造器呢?左想右想,還是不行,非得用它不可,因為欄位是

readonly

修飾,且他娘的還是

static

的,地球人都知道,我絕不能拿物件構造器去初始化乙個

static

修飾的字段。

我查了查

clr規範,發現型別構造器非常棘手,不好用,甚至值型別不能定義型別構造器。

廢話少說,來看

demo

。先定義個帶型別構造器的值型別。

namespace

static

型別構造器

} }

再在主類中構造十個stataicbuildervaluetype

型別的物件,看demo。

namespace

static

型別構造器

} }

我在型別構造器中設定乙個斷點,然後跟蹤,發現程式在斷點處根本就不停,譁,全過去了。我做了n次。

所以切記,不要在結構,值型別中,使用型別構造初試化值,它會讓你失望的。

再看看clr對型別構造器的其他約束。

在clr規範中這樣寫道;「clr保證每個應用程式域的型別構造器只執行一次,而且執行緒是安全的」,這是原話。

解釋一下,在clr規範中,應用程式域的定義,她是程式程序的邏輯叫法.

所謂,執行緒安全,就是資源在同一時間點,只有乙個執行緒能訪問,其他執行緒要訪問,必須等上乙個執行緒,釋放她的執行緒同步鎖。

來看demo

定義帶型別構造器的引用型別

namespace

static

型別構造器

public

static

int32 getvalue()

} }

再定義帶main方法的主類

namespace

static

型別構造器

public

static

void threadproc()

}}

那麼在thread中會不會對引用型別的構造器進行呼叫呢?

來看輸出

可以看到當主線程呼叫型別構造器,並釋放執行緒同步鎖後,執行緒thread,雖然顯示的去呼叫型別構造器,但是底層clr根本沒執行,i還是等於1。這是因為clr會去檢查是否已經執行了型別構造器,如果執行了,clr永遠不再生成呼叫型別構造器的本地**。

備註;ctor與cctor的區別

型別構造器

clr還支援型別構造器,也稱為靜態構造器。c 型別構造器可應用引用型別和值型別,永遠沒有引數。主要作用是 設定型別中靜態欄位的初始化。型別構造器不一定要在類中定義,但是最多也只能有乙個。例 class sometype class sometype 等價於 class sometype 還有 cla...

例項構造器與型別構造器

例項構造器即例項建構函式,型別構造器也就是靜態建構函式.1 在例項構造器裡面,我們可以初始化類的例項欄位和靜態欄位.class test 2 在型別構造器裡面我們只能初始化靜態字段,其目的也在於此.class test 3 例項構造器和型別構造器觸發的條件不一樣.例項構造器是在乙個類的例項構造的時候...

引用型別構造器

引用型別構造器 是將型別的例項初始化為良好狀態的一種特殊方法。建立乙個引用型別的例項時,首先為例項的資料字段分配記憶體,然後初始化物件的附加字段 物件指標 同步塊索引 最後呼叫型別中定義的例項構造器來設定物件的初始化狀態。構造引用型別的物件時,在呼叫型別的例項構造器之前,為物件分配所有欄位的記憶體總...