2012-01-26 36 views
4

所以我在一個類中有一個字段,但由於某種原因它正在回調一個未初始化的值0001.01.01。在一個類中使用靜態字段

private static DateTime start = new DateTime(2011, 1, 1); 

還有另一種靜態方法在另一個字段中用作初始值設定項。

private static readonly DateTime[] dates = SetupDates(20 * 12); 


private static DateTime[] SetupDates(int n){ 
    var d = start; 
    .... 
} 

認爲說,「新」在啓動將需要前完成之前SetupDates可以繼續...所以局部變量d將包含2011.1.1。看起來我錯了,我應該使用靜態構造函數。這是行爲嗎?

+0

是SetupDates靜態的? – Blorgbeard

+0

是的。爲了挑選它。 – sgtz

+1

另外SetupDates返回void,但設置一個字段。 – Ray

回答

6

The order matters here

類的靜態字段變量初始值設定項對應於按它們出現在類聲明中的文本順序執行的賦值序列。

確保您的start靜態字段是首先聲明的。 或者更好,但使用靜態構造函數,所以你不依賴於字段的順序。

例如這個工程:

private static DateTime start = new DateTime(2011, 1, 1); 
    private static readonly DateTime[] dates = SetupDates(20 * 12); 

但這並不

//Bad SetupDates relies on start which is not initialized 
    private static readonly DateTime[] dates = SetupDates(20 * 12); 
    private static DateTime start = new DateTime(2011, 1, 1); 

假設你改變SetupDates返回一個DateTime[]

+0

我將訂單移到了附近,解決了問題。感謝您指出了這一點。這是在C#中預期的嗎?它是C#實現中的錯誤嗎?好的...跟着那個鏈接。這解決了它。 TY。 – sgtz

+0

@sgtz答案頂部的鏈接是來自C#規範的引用。所以是的,它是預期的,不,它不是一個錯誤。然而,這有點令人驚訝,任何重構你的課程的人都可能沒有意識到移動訂單會產生影響。 – Ray

+0

同意。至少我很驚訝。當訂單很重要時,我會把這樣的東西放入構造函數中。 – sgtz

1

在調用SetupDates()之前沒有初始化靜態字段,在代碼中存在其他錯誤,這些錯誤在實際提供的代碼中不可見。

比如我看到聲明:

private void SetupDates(int n) 

而且

private static readonly DateTime[] dates = SetupDates(20 * 12); 

編輯

如果SetupDates() intializaes靜電場,就像在代碼中提供(但我重複代碼是不正確的),你應該關注初始化的順序。 在的情況下可能有可能的情況,當SetupDates()被調用之前start初始化。

函數不返回任何東西,它甚至不可能編譯。

+1

但SetupDates本身正在初始化一個靜態字段。所以你說的不可能是真的。 – Ray

+0

@ Ray:正確,我編輯了帖子,使其更加清晰。但事實是,代碼證明,甚至不會編譯,所以目前還不清楚發生了什麼。 – Tigran

1

你不能調用實例方法SetupDates爲構建靜態字段dates。這段代碼不應該編譯。

+0

NB。這在示例中已得到糾正。 TY。 – sgtz

+0

好的,然後忽略這個答案,並與CodingBarfield的去。 – flyx

2

只需將所有Init代碼移動到靜態構造函數中,然後按您希望執行的順序執行它。案件關閉;)

0

不明白你的問題,你可以請只發布一段代碼導致問題? 上面的代碼不能編譯。您可以使用New對象初始化靜態字段。

 var test = new Test(); 
    test.SetupDates(); 

如果您在SetupDates方法把一個斷點的日期將是1/1/2011

public class Test { 
     private static DateTime start = new DateTime(2011, 1, 1);  


     public void SetupDates() 
     { 
      //breakpoint here 
      var d = start; 

     } 
    } 
相關問題