2012-07-23 237 views
2

我已經把斷點爲「搞定」靜態變量初始化順序

static readonly LawClass s_Law = new LawClass(); 
public static LawClass Law { get { return s_Law; } } 

,發現s_law爲空。

這怎麼可能?我認爲靜態變量在第一類訪問之前和逐行順序被初始化。

+1

不可能是實際的答案,但可能有一個靜態構造函數將其設置爲空(即開發人員只是表示意思)。另外,將來你能否提供代碼片段作爲文本,而不是文本的圖片? – Servy 2012-07-23 18:19:21

+0

爲什麼不在getter中檢查's_Law'並將它設置爲一個新實例(如果它爲空)? – mgnoonan 2012-07-23 18:21:01

+0

@mgnoonan嗯,它是'只讀',所以如果你嘗試過,你就不能設置它。除此之外;重點是它不應該爲空,因爲它已初始化爲一個值,並且以後不能更改。 – Servy 2012-07-23 18:23:33

回答

4

這僅僅是猜測,但從http://msdn.microsoft.com/en-us/library/aa645758(v=vs.71).aspx

如果靜態構造(第10.11節)在類存在,靜態字段初始化的執行 發生之前立即執行 該靜態構造。 否則,靜態字段初始值設定項是在首次使用該類的靜態字段之前的執行相關時間執行的 。

如果您在屬性獲取方中斷,靜態支持字段尚未被訪問,因此可能已經或可能未被初始化。

+0

如果您目前有問題,那麼需要定義s_Law值的代碼行還不需要。在下一行中,將需要一個值,我期望在那個時候進行初始化。靜態不需要懶惰,但在他們通常使用的Microsoft CLR中。 – KeithS 2012-07-23 18:41:21

0

謝謝你們的幫助!我看着堆棧跟蹤,發現我的靜態變量初始化順序有一些瘋狂的遞歸。所以我簡化了代碼,現在它可以工作。