記得我在分析
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 例項構造器和型別構造器觸發的條件不一樣.例項構造器是在乙個類的例項構造的時候...
引用型別構造器
引用型別構造器 是將型別的例項初始化為良好狀態的一種特殊方法。建立乙個引用型別的例項時,首先為例項的資料字段分配記憶體,然後初始化物件的附加字段 物件指標 同步塊索引 最後呼叫型別中定義的例項構造器來設定物件的初始化狀態。構造引用型別的物件時,在呼叫型別的例項構造器之前,為物件分配所有欄位的記憶體總...