ОБНОВЛЕНО:
Я читаю здесь 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;
}
}
Я бы очень признателен за ответ, который может прояснить это для меня, спасибо!