【问题标题】:Static Constructor and singleton静态构造函数和单例
【发布时间】:2015-08-06 19:03:54
【问题描述】:

朋友告诉我,下面是在C#中创建singleton design pattern的方法之一

    public class class1{

    public static class1 Obj { get; private set; }

    static class1()
    {
        Obj = new class1();
    }
}

他告诉我静态构造函数在应用程序中只运行一次,所以只会创建一个class1的实例, 但我看到我必须添加这个if(Obj==null) 来检查对象的存在

      public class class1{

        public static class1 Obj { get; private set; }

        static class1()
        {
            **if(Obj==null)**
            Obj = new class1();
        }
    }

哪个代码是正确的?

【问题讨论】:

  • “我明白了”是什么意思?是什么让你认为你需要这样做? (我个人会使用只读字段,请注意...)见csharpindepth.com/Articles/General/Singleton.aspx
  • if 没用。
  • 如果没用,为什么?请解释
  • @AbrahamJosef 因为在那一步不可能Obj 不为空。
  • 我更喜欢使用带有 GetInstance() 和私有构造函数的经典单例模式。您无需考虑 c# 的工作原理

标签: c# design-patterns singleton


【解决方案1】:

假设唯一设置Obj的地方是在static构造函数中,那么第一个代码sn -p是正确的;第二个代码 sn -p 是多余的。

由于static 构造函数每个类只运行一次。如果没有其他路径可以设置Obj,则其值将始终为null,位于static 构造函数的开头。所以检查if(Obj==null)总是会成功,这就显得多余了。

【讨论】:

    【解决方案2】:

    static constructor 只会被调用一次,在分配静态变量之前的某个时间点。
    这意味着您的朋友是正确的,您不需要 if 声明 - 这是多余的。
    这是因为您不能手动调用static constructor,它只会在运行时开始时调用一次。

    延伸阅读:https://stackoverflow.com/a/4506997/617485

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 2013-03-05
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2014-08-25
      • 2010-09-12
      相关资源
      最近更新 更多