代码之家  ›  专栏  ›  技术社区  ›  Chris

使用静态构造函数在C中创建单例#

  •  1
  • Chris  · 技术社区  · 14 年前

    我一直在看一篇关于在c中创建静态构造函数的文章:

    http://csharpindepth.com/Articles/General/Singleton.aspx

    现在,他没有提到的一个选项是使用一个简单的静态构造函数。做下面这样的事情有什么问题吗?如果可行的话,这似乎比他复杂的解决方案简单多了。

    public static class ServiceFactory
    {
      static ServiceFactory()
      {
        container = new Foo();
      }
      static Foo container;
    
      public static Instance {
        get {
        return container;
        }
      }
    }
    

    我问的原因是我正在做一个代码检查,如果它是好的,我想离开它。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    你的代码并不是在构建一个单体。它正在创建 Foo ,估计其他人也可以-这意味着它不是一个单一的。

    ServiceFactory ,但那不是一回事。

    除非你有一个你限制过的类,所以它只能有一个实例,否则你没有一个单例。你可能有一个工厂模式,一个缓存,不管怎样-但你没有一个单一的。

    static Foo container = new Foo();
    static ServiceFactory()
    {
    }
    

    ... 我不知道你为什么认为你的版本比上面简单。如果你 想要真正创建一个singleton,您将需要一个私有构造函数,用于您试图转换为singleton的任何类。在这一点上,你基本上得到了我的第四个例子,所以我再次不确定你认为你在哪里使事情变得更简单。

    my article on beforefieldinit 更多细节,还有我的 blog post about the CLR v4 changes

        2
  •  1
  •   Paul Ruane    14 年前

    您的代码相当于他的第四个示例,除了您正在使用显式类构造函数,而他正在声明点初始化。

    您应该(在大多数情况下)避免使用singleton模式,因为它使扩展和单元测试应用程序变得非常困难。

    a behavioural difference 关于使用类构造函数时何时构造单例。

        3
  •  0
  •   Randolpho    14 年前

    public static class ServiceFactory
    {
        private static readonly container = new Foo();
        public static Instance { get { return container; } }
    }
    

    两者都工作得很好,而且都是完全有效的——只要你不需要懒惰。如果您需要懒惰,请使用文章中指出的第五个版本。