【问题标题】:Why Singleton Lazy Instantiation over Static Initialisation Or Multi-threaded Instantiation? C#为什么单例惰性实例化优于静态初始化或多线程实例化? C#
【发布时间】:2020-03-04 19:27:09
【问题描述】:

更新:

我在这里读到了https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff650316(v=pandp.10)?redirectedfrom=MSDN 关于在 c# 中实现单例的 3 种不同方法。我对理解这一行特别感兴趣:

因为实例是在 Instance 属性方法中创建的, 该类可以执行其他功能(例如, 实例化一个子类),即使它可能会引入不受欢迎的 依赖关系。

我知道虽然惰性实例化不是线程安全的,但仍然因为它只按需实例化它,因此每次加载类时都避免实例化。我还注意到,在延迟实例化中,我可以使用非默认构造函数并传递参数,而在静态中。但是说我不介意每次加载时都会实例化它,并且我对默认构造函数很满意,我为什么要选择 Lazy 而不是 static 甚至是多线程方法?有什么 Lazy 可以让我得到静态和多线程无法做到的吗?一个可以被子分类而另一个不能吗?

另外,该页面似乎在说静态初始化也是线程安全的?这是为什么?如果后者也很好,他们为什么要继续使用第三种多线程方法?

因为 Singleton 实例被私有静态引用 成员变量,实例化不会发生,直到类 首先由对 Instance 属性的调用引用。这个解决方案 因此实现了惰性实例化属性的一种形式,如 单例的设计模式形式。

(尽管如此,我不明白这一段的第一部分:如果这里的实例化也只发生一次,就像他们在之前的几段中所说的那样:

“在此策略中,实例是在第一次任何成员时创建的 类的引用。”

它与惰性方法有什么不同?)

总而言之,我的问题是,相比第一种惰性方法,静态方法能解决什么问题?除了它允许我使用非默认构造函数之外,我为什么还要选择 Lazy?

虽然我在做:

考虑以下两对 Lazy 与 Static 的示例,我的问题是,在每一对中,它们之间有何不同?我可以看到,'get' 嵌套在 GetInstance/Instance 方法中,但它有什么不同吗?

 public class LazySingleton
    {
        private static LazySingleton _LSInstance;

        private LazySingleton() { }

        public  static LazySingleton GetInstnace 
        {
            get{

            if (_LSInstance == null)
            {
                _LSInstance = new LazySingleton();

            }

            return _LSInstance;
            }
        }
    }

    public class LazySingleton
    {

        private static LazySingleton _LSInstance { get; set; } 

        private LazySingleton() {   }

        public  static LazySingleton GetInstnace() {  

            if (_LSInstance == null)

                _LSInstance = new LazySingleton();

            return _LSInstance;

        }
    }

================================================ ========

 public class Singleton
    {


        private    Singleton()
        {

        }

        private static Singleton _LSInstance = new Singleton();


        public static  Singleton GetInstnace 
        {
            get{ 

            return _LSInstance;
               }
        }
    }

public class Singleton
  {


      private    Singleton()     {    }

      private static Singleton _LSInstance = new Singleton();


      public static  Singleton GetInstnace()
      {

          return _LSInstance;

      }
  }

非常感谢您的回复,可以为我澄清这一点,谢谢!

【问题讨论】:

    标签: c# design-patterns singleton getter-setter


    【解决方案1】:

    从您的代码中,我可以看出 1 个区别。假设要实例化您的实例,您需要等待系统加载一些数据。而且您不确定系统启动时数据是否可用(可能几秒钟后,它可用)。并且您的服务只在某些页面中需要。使用延迟加载,您不会有任何问题,因为您要等到一段时间后才会使用该服务。但是使用静态实例化,你会遇到问题。

    【讨论】:

    • 除了简单的时间之外,还可能是更大的内存或 CPU 密集型。
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-08-25
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多