需要帮助Static vs Singleton对象

时间:2013-01-31 12:59:09

标签: wpf c#-4.0

我的应用程序中需要一个对象。为实现这一点,我有两种方法

  1. 将对象定义为静态。

    public class App
    {
        public static MyClass myObject;
    }
    
  2. 制作类Singleton

    public class MyClass
    {
        private MyClass()
        {
        }
        public static MyClass Instance
        {
            get
            {
                return Nested.instance;
            }
        }
        class Nested
        {
            static Nested()
            {
            }
            internal static readonly MyClass instance = new MyClass();
        }
     }
    
  3. 任何人都可以帮助我解决这两种方法的优缺点。

2 个答案:

答案 0 :(得分:2)

我认为这些方法都不好,您应该通过inversion-of-control调查dependency injection

为什么上述解决方案不好?他们使测试成为一场噩梦,而“全球”对象的生命周期则由其消费者决定。见here for more issues surrounding the singleton anti-pattern

相反,您最好创建对象,然后注入到需要它的对象中。在这种情况下,注入只是意味着通过setter或构造函数参数提供它。

通过使用注入,您只需配置需要此“全局”组件的组件,并且通过使用接口,您可以替换不同的版本(例如,真实与模拟变体)。重要的是,“注入”组件的生命周期由周围的框架控制,而不是消费实体。

答案 1 :(得分:0)

我认为2个选项之间的主要区别在于它将被创建的对象。 对于静态成员,将在创建App对象时或第一次将该类用于其他静态方法/成员时创建。

在单身人士的情况下,可能不需要从头开始使用它,因此在时间消耗不可见的时候及时启动它。