2010-01-13 58 views
1

如果我有一個空的集合對象,但需要填充並且將被類使用(比如Foo類),那麼是否最好在構造函數中進行填充?我應該用ctor還是私人靜態方法填充集合?

喜歡的東西:

List<string> strings = new List<string(); 
strings.Add("sjsjhsj"); 
// So on... 

還是應在靜態構造函數私有? State沒有被包含的類改變,所以這可以是靜態的,對嗎?

順便說一句,如果我寫this.Name = name;或:

john.Name = name; 
// Instance method passing in john as a Person object. 

這些都知道是變化的狀態,因此不應該是靜態的?或者它只是與實例?

如果我需要一個集合,我希望能夠更改內容而無需重新編譯,我應該使用txt文件或xml作爲源。使用集合時速度更快? txt文件將使用ReadAllLines(); XML將使用NodeNavigator(不確定具體的方法/對象名稱)。

謝謝

+2

我認爲這裏至少有三個不同的問題。我可以建議問他們三個不同的SO問題嗎? – 2010-01-13 22:28:57

回答

3

首先,靜態構造函數不能是public/private。他們只是存在。

如果您的集合的同一個實例將在擁有的類的所有實例中共享,那麼它可以是靜態的。

靜態並不意味着它不會改變狀態。它仍然可以改變。區別在於類的所有實例之間共享靜態字段,因此需要協調該字段的可變操作。如果該類的所有實例將始終使用使用相同的數據,請將其設置爲靜態。

文本文件或xml文件對您來說是否更快取決於數據。

2

我認爲你對「靜態」的含義有誤解。

在C#中,「靜態」並不意味着狀態不會改變。你可以擁有變化狀態的靜態變量。

在C#中,「靜態」是指變量的範圍 - 不是它的可變性。當你將一個變量定義爲靜態變量(並且使用一個靜態變量)時,你正在處理類級別而不是實例級別。

如果您的變量是特定於類的,而不是類的實例,那麼將其設置爲靜態可能是適當的。

0

如果集合具有在編譯時已知的靜態值集合,你可以,在C#3.0(VS 2008),在類定義中使用集合初始化語法:

private static readonly IList<string> strings = new ReadOnlyCollection<string>(
    new List<string>(5) 
    { 
     "sjsjhsj", 
     "string 2", 
     "string 3", 
     "string 4", 
     "string 5" 
    }); 

ReadOnlyCollection生活在System.Collections.ObjectModel命名空間。 List<string>構造函數中的5指的是其容量,如果您事先知道該數字,則會導致運行時優化。

相關問題