2013-09-01 89 views
1

我已閱讀關於何時使用靜態類以及何時推薦使用實例類的文章。不過,我的印象我的下面的例子有點落在之間:我應該在這種特定情況下使用靜態或實例類嗎?

  • 沒有類實例是需要的,存儲狀態在AppDomain中的成員之間共享。
  • 應該可以從AppDomain中的不同類實例訪問狀態。
  • 不需要抽象或覆蓋。

所以,我的問題是:我應該繼續使用它作爲靜態還是使用單例概念更好?

public static class SubscriptionManager 
{ 
    private static Dictionary<string, string> Repository { get; set; } 

    static SubscriptionManager() 
    { 
     Repository = new Dictionary<string, string>(); 
    } 

    public static void Subscribe(string key, string value) 
    { 
     if (Repository.ContainsKey(key)) 
      Repository[key] = value; 
     else 
      Repository.Add(key, value); 
    } 

    public static void Unsubscribe(string key, string value) 
    { 
     if (Repository.ContainsKey(key)) 
      Repository.Remove(key); 
    } 

    public static string GetSubscription(string key) 
    { 
     if (Repository.ContainsKey(key)) 
      return Repository[key]; 
     else 
      return ""; 
    } 
} 
+0

順便說一句,你不需要任何'ContainsKey()'檢查。對於'GetSubscription()',使用'TryGetValue()';在別處,總是調用'Remove()'或setter。 – SLaks

+0

如果存儲庫字典是你想要使用的每個地方的一些數據,我認爲它是可以的。 –

+0

@ user2675751,是的,靜態成員提供的功能依賴於存儲的狀態,必須可以在同一個AppDomain中通過多個不同的**類實例訪問。我基本上覺得我留下了兩個選擇,傳遞實例和靜態類。 –

回答

0

記住大的靜態類會佔用大量內存,所以在不需要的時候避免它們。 在這種情況下,我會建議你去靜態類。這樣更好。

+0

感謝但我a)我沒有看到爲什麼靜態類佔用更多的內存(甚至那些持有國家),而不是部分的總和,可以這麼說(指的是幾個類實例存儲狀態總計相同比存儲在靜態類中的狀態存儲的數據量多),b)我希望聽到理性的原因,這裏靜態類是優選的。 –

+0

@MattWolf:靜態字段的值永遠不會GC'd(除非你清除字段)。這是否是個問題完全取決於您的設計。 – SLaks

+0

@SLaks,當然,但是考慮到共享狀態並使狀態可以訪問AppDomain中的不同類實例和子類,它們也不會被GCd訪問,不是嗎?這個例子中的州的目的特別是在應用程序的整個生命週期內共享狀態。 –

0

你的例子提供了一個類似Repository的模式的顯式實現,如果它是可擴展的,最終可能證明它更有價值。如果你將它作爲一個靜態類來實現,那麼你現在做出的決定是不應該的。

另一個可能有價值的實現的例子可能是使用.NET 4 ConcurrencyDictionary<TKey, TValue>,所以代碼可以用於更高容量的併發場景,因爲Dictionary類不是線程安全的。

你的建議是YAGNI,這對於大型項目的迭代很有好處,但是除非你知道未來是什麼,爲什麼要限制已經編寫的代碼的潛力?

我可能會從您的類中生成一個接口來表示它的裸骨(將實現與合約分開),並利用IoC容器讓您的類的用戶決定要爲他們的場景使用什麼實現。

當然這隻有在您的項目相當小或者關心項目之間共享代碼時才重要。祝你好運!

+0

這是專門用於此項目的解決方案。目的很明確,沒有擴展性計劃。我目前使用一個實例類,效率非常低,因爲無論子類有多深,我都需要將實例傳遞給每個訪問器。 (順便說一句,代碼只是一個示例來描述問題,它並不反映實際的狀態或功能) –

相關問題