2013-07-01 40 views
2

如果您有以下:更改爲了私人只讀屬性進行評估

public class MyClass { 
     private static readonly MyObject obj = 
       new MyObject { parent = listObject[0] }; 
     private static readonly List<MyObject> listObject = 
       new List<MyObject> { new MyObject() }; 
} 

時MyClass的初始化,因爲當它試圖初始化OBJ,是的ListObject無效,則會引發運行時錯誤。有沒有一種方法可以明確指定每個只讀對象何時被初始化(如通過屬性),所以listObject在obj之前被初始化(除了重構或重新排序代碼之外)?我意識到訂單決定了每件物品何時執行,但確定的順序看起來很脆弱。

我爲簡單代碼提前道歉。

+2

這是一個_runtime_錯誤。 – SLaks

+0

[C#中的靜態構造函數/初始化程序的順序]的可能重複(http://stackoverflow.com/questions/185384/order-of-static-constructors-initializers-in-c-sharp) – tster

+0

@Slaks。咄。謝謝。更新的問題。 – bryanjonker

回答

2

您需要static constructor !!

public class MyClass { 
    private static readonly MyObject obj; 
    private static readonly List<MyObject> listObject; 

    static MyClass() 
    { 
     listObject = new List<MyObject> { new MyObject() }; 
     obj = new MyObject { parent = listObject[0] }; 
    } 
} 

「在創建第一個實例或引用任何靜態成員之前,會自動調用靜態構造函數以初始化類。

+0

請勿複製並粘貼我的代碼>。> –

+0

別擔心,我沒有。我雖然從OP複製。當你有一個實例構造器而不是靜態的時候,我發佈了這個。 SimpleClass()構造函數(我將它改爲MyClass)來自我從MSDN發佈的鏈接。 – Cemafor

4
public class MyClass { 
    private static readonly MyObject obj; 
    private static readonly List<MyObject> listObject; 

    static MyClass() 
    { 
     listObject = new List<MyObject> { new MyObject() }; 
     obj = new MyObject { parent = listObject[0] }; 
    } 
} 

如果將初​​始化帶入構造函數,則可以重新排列字段初始化的順序。

成員變量和靜態變量的初始化保證按它們在文件中出現的順序進行。所以,你可以避免編譯時錯誤首先初始化列表:

static readonly List<MyObject> listObject = new List<MyObject> { new MyObject() }; 
static readonly MyObject obj = new MyObject { parent = listObject[0] }; 

我會選擇在構造函數初始化你的領域依然。依靠它們聲明的順序來初始化的字段非常脆弱。如果有人爲了滿足他們的審美需要而改變領域的秩序呢?繁榮。

+0

這實際上不起作用,因爲靜態方法在非靜態構造函數之前被調用。 –

+0

或者你可以將你的變量'listObject'提升爲一個屬性並且延遲加載它。 –

+0

我沒有想到構造函數會影響靜態初始值設定項。 – Tormod

1

靜態字段的順序很重要。它們從上到下進行初始化,並且可以重新排列它們以解決您的問題。

public class MyClass { 
    private static readonly List<MyObject> listObject = 
       new List<MyObject> { new MyObject() }; 
    private static readonly MyObject obj = 
       new MyObject { parent = listObject[0] }; 
} 

但是,這會帶來意想不到的問題,例如,當代碼格式化的字母順序排列字段定義。

1

字段初始值設定項是按代碼順序顯式執行 - 即自上而下。請注意,如果在單獨的文件中使用部分類,這仍然是未定義的。但是:如果順序很重要,那麼你應該將代碼移入構造函數(在這種情況下是一個靜態構造函數)。重新排序相互依賴的字段初始值設定項只是在維護期間要求出現問題。