2013-09-01 46 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

这是专门用于此项目的解决方案。目的很明确,没有扩展性计划。我目前使用一个实例类,效率非常低,因为无论子类有多深,我都需要将实例传递给每个访问器。 (顺便说一句,代码只是一个示例来描述问题,它并不反映实际的状态或功能) –

相关问题