2012-01-23 30 views
3

我有一個靜態類的靜態列表屬性。我只想生成列表的內容一次,然後就可以使用它。我當然也想確保數據是真正創建的,這樣當一個對象使用這個類時,它在列表中有數據。我該如何做到這一點?如何確保生成靜態類中的數據,並且只生成一次?

public static class MyClass 
{ 
    public static List<int> MyList = new List<int>(); 

    public MyClass() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      MyList.Add(i); 
     } 
    } 
} 

回答

6
  • 我要生成列表的內容只有一次
  • 我也想以確保數據被實際創建

您當前的代碼確保正是,當您將構造函數更改爲靜態時:

static MyClass() { } // not public or private 

在類的任何其他成員可以執行之前,類加載器將執行初始化MyList。這是班級第一次使用時發生的情況。

可觀察到的行爲是靜態成員在應用程序開始時處於初始狀態(一次)。

只有當你建立靜態初始化器相互依賴的東西時,你可能會有一些想法/擔心。

+1

但每次我引用類的時候,不會構造再次運行所有的代碼呢? – Bildsoe

+1

我相信那個代碼有錯誤。靜態類不能有實例構造函數。 –

+0

我首先錯過了一個事實,即你的ctor是一個實例ctor,不允許在靜態類中使用。靜態Ctor是你所需要的。 –

5

您應該使用static constructor對於這一點,就像這樣:

static MyClass() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     MyList.Add(i); 
    } 
} 

需要注意的是靜態構造函數不需要也不接受任何範圍修飾符像public

0

可以使用的存取方法用於列表以及一個bool變量,以跟蹤您的列表是否已初始化並填充了數據。

喜歡的東西:

private static List<int> myList; 

private static void doInitializeList() { 
    myList = new List<int>(); 
    // fill list here 
} 

public static List<int> getMyList() { 
    if (!_myListInitialized) { 
     doInitializeList(); 
    } 
    return myList; 
}