假設我們有乙個類a帶有beforefieldinit修飾符(beforefieldinit修飾符是編譯器在編譯完之後,自動加上的,只能通過反編譯工具看)。總的來說,加上beforefieldinit修飾符就意味著「類a會在變數可能被引用的前一刻,提前完成初始化。從理論上,加上beforefieldinit修飾符的類a可能延遲初始化,如果你呼叫的靜態方法沒有引用任何靜態類變數,jit就不需要初始化這個類a。
實際上,類a也可能早早地初始化,即使我們在**中沒有引用到類a中的變數。但這也沒什麼問題,他可以在可能用到類變數的第乙個方法就初始化。打個比方,就好像我們辦酒席,我們不可能確認具體有多少人回到,我們只能預先安排多少要多少桌子,多少菜(這就是提前初始化的概念)。比較一下**段,**段中的兩個類firsttype、secondtype都沒有加beforefieldinit修飾符,則那個類先被初始化取決於which變數。
1如果這兩個類firsttype、secondtype都有加beforefieldinit修飾符(在c#中缺省會加上,除非這個型別實現了靜態建構函式),在剛進入dosomething這個方法的時候,這兩個類就會同時被初始化(通常是這樣,不能絕對保證public
static
void dosomething(bool
which)27
else
811 }
),跟which變數無關了。
這也是為什麼我們建議在單例模式中使用靜態建構函式的原因。
本文翻譯自
kissazi2
修飾符 許可權修飾符
四種形式許可權修飾符的訪問情況 publicprotected不寫private 同乙個類中 四種都可以 同一包中的不同類 除了private剩下都可以 不同包下的子類 public protected 可以 不同包下的不同類 只有public可以 許可權修飾符 public protected 預...
C 修飾符 類修飾符和成員修飾符
c 修飾符之類修飾符 public internal partial abstract sealed static internal 本程式集內的成員可以訪問。partial 部分類,可以將乙個類分成幾部分寫在不同檔案中,最終編譯時將合併成乙個檔案,且各個部分不能分散在不同程式集中。c 修飾符之成員...
java修飾符 abstract 修飾符
abstract 修飾符 abstract 修飾符可以用來修飾類和成員方法 用 abstract 修飾的類表示抽象類,抽象類位於繼承樹的抽象層,抽象類不能被例項化,即不允許建立抽象類本身的例項。沒有用 abstract 修飾的類稱為具體類,具體類可以被例項化。用 abstract 修飾的方法表示抽象...