Почему Singleton Lasy Instantiation вместо Stati c Initialisation или многопоточной реализации? C# - PullRequest
2 голосов
/ 04 марта 2020

ОБНОВЛЕНО:

Я читаю здесь https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff650316 (v = pandp.10)? Redirectedfrom = MSDN о 3 различных способах реализации синглтона в c#. Я особенно заинтересован в понимании этой строки:

Поскольку экземпляр создается внутри метода свойства Instance, класс может использовать дополнительные функции (например, , создание экземпляра подкласса ). даже если это может привести к нежелательным зависимостям.

Я понимаю, что, хотя ленивое создание экземпляров не является поточно-ориентированным, все же потому, что оно создает его только по требованию, таким образом, избегает создания экземпляров каждый раз при загрузке класса. Я также заметил, что в Lazy-instantiation я могу использовать конструктор не по умолчанию и передавать параметры, тогда как в Stati c .. Но, скажем, я не возражал, что он создается каждый раз, когда загружается, и я доволен конструктором по умолчанию, почему я предпочитаю Lazy вместо stati c или даже по многопоточному подходу? Есть ли что-то, что Lazy может достать мне, что stati c и многопоточное не могут? Может ли один быть подкласс, а другой нет?

Кроме того, эта страница, кажется, говорит, что инициализация stati c также поточно-ориентирована? Это почему? И почему они переходят к третьему многопоточному подходу, если последний тоже подойдет?

Поскольку на экземпляр Singleton ссылается закрытая статическая переменная-член, создание экземпляра не происходит до тех пор, пока класс не станет сначала ссылается на вызов свойства Instance. Поэтому в этом решении реализована форма свойства отложенного создания экземпляров, как в форме «Шаблоны проектирования» Singleton.

(Тем не менее, я не понимаю первую часть этого параграфа: если инстанцирование здесь также происходит только один раз, как говорят в нескольких параграфах ранее:

«В этой стратегии экземпляр создается при первом обращении к любому члену класса.»

Чем он отличается от ленивого подхода?)

Итак, подведем итог: мой вопрос в том, что нужно сделать, чтобы решить проблему с первым, ленивым подходом c, и почему я по-прежнему выбираю Ленивый, кроме той причины, по которой он позволяет мне использовать конструктор не по умолчанию?

Пока я в этом:

Рассмотрим две следующие пары примеров «Ленивый против Стати» c, но в каждой паре вопрос в том, как они отличаются друг от друга? В одном я вижу, что «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;

      }
  }

Я бы очень признателен за ответ, который может прояснить это для меня, спасибо!

1 Ответ

1 голос
/ 04 марта 2020

По вашему коду я могу отличить 1. Давайте предположим, что для создания экземпляра вашего экземпляра вам нужно подождать, пока система загрузит некоторые данные. И вы не уверены, что данные доступны при запуске системы (возможно, через несколько секунд, они доступны). И ваш сервис нужен только на некоторых страницах. С ленивой нагрузкой у вас нет никаких проблем, так как вы не пользуетесь сервисом только через некоторое время. Но при создании экземпляра stati c у вас возникнет проблема.

...