2012-09-03 38 views
2

我有一個名爲Test的靜態類和一個私有列表集合。現在我想實現一個getter來將我的List返回到主類。這是正確的方法嗎?靜態類和Getter

其次是可以實現一個靜態構造函數嗎?如果不是,我該如何正確申報我的清單收藏?

static class Storage 
{ 

    private static List<string> store; 

    static Storage() 
    { 
     store = new List<string>(); 


    } 

    //Is it okay to have a getter in my static class to return my List Collection 
    public static List<string> getList 
    { 
     get 
     { 
      return store; 
     } 


    } 

    public static void addString(string add) 
    { 
     store.Add(add); 
    } 

    public static void removeString(string remove) 
    { 
     store.Remove(remove); 
    } 
+0

對我來說看起來像是[codereview.se]。 – Adam

+0

這裏你應該非常小心線程問題。靜態字段通常是線程的問題。 –

回答

4

如果您返回對getter中列表的引用,那麼任何調用者都可以添加或刪除列表中的項目,而無需通過靜態類上的add/remove方法。如果你想防止他人修改名單我會從吸氣返回read only collection

public static IEnumerable<string> getList 
{ 
    get 
    { 
     return store.AsReadonly(); 
    } 
} 

編輯

正如馬克指出,你需要注意多線程問題。想象一個線程枚舉通過getter獲得的集合,而另一個線程通過添加或刪除一個項目來修改它 - >你會得到一個異常,說你在枚舉集合時不能修改集合。唯一的解決方案是鎖定對私人收藏的所有訪問權限,並在收件人中返回副本。

+0

謝謝克里斯。而不是IEnumerable,我可以說ICollection? –

+0

是的,你可以返回'ICollection'而不是 – ChrisWue

+0

比方說我使用ICollection,並從我的主程序調用它,我將如何通過循環來查看字符串值? –

0

您可以改爲使用private static readonly List<string> store = new List<string>()

有一個屬性來返回您的字段是正確的方法來處理它。你永遠不應該有公共領域。

此外,雖然我們討論的是風格的主題:方法和屬性名稱應以每個Microsoft發佈的命名約定的大寫字母開頭。

+0

謝謝丹尼爾。你對我的方法名稱正確。我只是在玩C#。所以,我的getter實現返回我的List集合的方式是正確的方法嗎? –

+0

是的,沒關係。雖然添加和刪除方法是多餘的。 –

+0

沒關係,我明白了爲什麼 –