我們知道對於class和struct都可以定義建構函式,而建構函式又有例項建構函式和靜態建構函式。例項建構函式在每次例項化時,都會執行一次。那靜態建構函式是否如此呢?我們先來看一段**:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace constructortest
}public class cdata}}
我們猜測一下執行的結果:
a行輸出的是1.這個比較容易想到,因為num初始為0,在建構函式中執行了num++,所以結果為1.
那b行輸出的呢?會不會又執行了一次num++,導致輸出結果為2?我們來看輸出的結果,見下圖
我們看到,輸出的結果都是1.
這是為什麼?難道說num++只執行了一次嗎?我們設斷點來看看。
從斷點的執行順序上看,每一次呼叫cdata.num時,進入到了cdata的靜態建構函式中,使得num由0變成了1.而第二次呼叫cdata.num時,不再進入到cdata的靜態建構函式中,所以num依然是1。
所以得出結論:靜態建構函式只執行一次。
那有人會問,如果併發呢?
併發也依然會執行一次。因為在呼叫靜態建構函式時,會先檢測有沒有被初始化(即有沒有被呼叫過)。如果有,則直接跳過。如果沒有,將進入靜態建構函式內部。
所以靜態建構函式非常適合用在單件模式中。我們可以看一段《clr via c#》一書中的一段說明:
結論:靜態建構函式在程式域的層級確保了只會執行一次,且是執行緒安全的。所以非常適合於用在單件模式中(或者只需要單一物件的地方)。
靜態建構函式到底執行了多少次?
我們知道對於class和struct都可以定義建構函式,而建構函式又有例項建構函式和靜態建構函式。例項建構函式在每次例項化時,都會執行一次。那靜態建構函式是否如此呢?我們先來看一段 using system using system.collections.generic using system....
php建構函式和析構函式到底幹嘛用的
一說到php魔術方法,最先想到的就是構造和析構函式,那麼,他們到底有什麼神奇的地方,而被稱為魔術方法,並被當做代表人物呢 一.建構函式 construct 有建構函式的類會在每次建立新物件時呼叫此函式,所以可以在此函式內做一些使用物件之前的初始化。我最早接觸到這個函式是在寫登入的時候,會在公共控制器...
Java建構函式到底有沒有返回值?
博主是新手,之前寫建構函式會寫上乙個void,然後編譯器就會報錯,提示語法錯誤。首先,建構函式是沒有返回值的 呼叫new constructor 時,new首先會建立物件的引用,然後通過 複製給宣告的物件引用,如construtor c new constructor new constructor...