2009-12-18 30 views
0

以下是創建對象時遇到的特定問題,例如集合,這些對象需要在整個應用程序範圍內可用。收藏和應用廣泛使用?

我有以下類:

class UserDataCollection 
    { 
     List<UserData> Collection = new List<UserData>(); 
     UserData current; 

     public UserData Current 
     { 
      get { return current; } 
      set 
      { 
       current = value; 
      } 
     } 

     public UserDataCollection(UserData userdata) 
     { 
      this.current = userdata; 
     } 

     public void Add (UserData item) 
     { 
      Collection.Add(item); 
     } 


    } 

現在對每一個的UserData對象我想補充,它會創建一個新的列表對象,每次我去UserDataCollection datacoll = new UserDataCollection(userdata);

所以,我的目標永遠不會添加到相同的集合中,這不是該集合的要點。

這是一個很好的單例情況,或者只是在應用程序初始化時創建對象並始終使用相同的對象?

什麼是這樣的最好的設計實踐?

回答

1

您可以使列表靜態。那麼只會有一個集合。

+0

靜態集合將需要更多的線程安全代碼。 – 2009-12-18 17:38:23

+0

那麼我還沒有掌握一個靜態對象的屬性,你或者有人可以詳細說明一下嗎? – 2009-12-18 17:40:11

+1

@Tony,靜態屬性就像是一個全局變量..任何時候都可以被任何東西訪問,因此在多線程應用程序中,一個線程可能會在另一個線程之前更改靜態變量的值。這被稱爲比賽條件。 – 2009-12-18 17:47:41

0

這樣的集合顯然是針對多個對象的,因此您可以在創建對象集的地方實例化它們...如果您想使用ctor,那麼它應該將參數a .. 。集合或枚舉集的對象......

// Inheriting from List<UserData> eliminates need for most of your code 
class UserDataCollection: List<UserData> 
{   
     public UserDataCollection(IEnumerable<UserData> users) 
     { 
      foreach (UserData usr in users) 
       Add(usr); 
     } 
} 
+0

這是一個我希望在應用程序存在過程中跟蹤的集合。 – 2009-12-18 17:34:56

+0

然後,在應用程序啓動時,在應用程序的主體中創建它,並將引用傳遞給需要它的任何位置,或者使其全局可訪問(將此集合的單個實例放入某個靜態類的靜態屬性中) – 2009-12-18 17:38:39

0

如果將永遠只能是每個應用程序一個UserDataCollection話,我不明白爲什麼不能讓一個單身。

+0

因爲單身人士是邪惡的。 – jason 2009-12-18 17:34:08

+3

單身人士在保證他們的情況下是完全理性的。一攬子報表是邪惡的。 – rossipedia 2009-12-18 17:38:05

+0

你爲什麼這麼說。當然,如果基礎邏輯需求遵循單例模式,那麼單例是理想的。 – 2009-12-18 17:41:16

0

我喜歡這裏的單身人士的想法,如果你只想爲你的整個應用程序。如果你在ASP.NET應用程序中使用它,你將不得不小心使用Singletons,因爲static變量就像在應用程序狀態下保存數據一樣......這可能是你想要的......但對外界不容易察覺(可維護性問題)。

1

這取決於

如果它是一個Web應用程序,你可以在應用程序啓動創建收集並存儲到的HttpContext的應用性能。如果沒有,您可以使用單例或IoC容器並將其配置爲始終返回對象的同一實例。

P.S:如果應用程序的多個線程同時運行,確保在更新集合之前使用鎖定。

希望它會有所幫助。

+0

訪問列表時需要鎖定以及更新,因爲您不希望正在迭代的列表中途更新。 – 2009-12-18 17:50:13