C # не дает никакой гарантии того, когда будет создано статическое поле _instance
. Это связано с тем, что стандарт C # просто утверждает, что классы (которые помечены в IL как BeforeFieldInit) могут инициализировать свои статические поля в любое время до того, как к полю будет произведен доступ. Это означает, что они могут быть инициализированы при первом использовании, они могут быть инициализированы в другое время, вы не можете быть уверены, когда.
Отбросьте Ленивое использование
Я предлагаю отказаться от конструкции Lazy
и ввести статический ctor для создания экземпляра. Таким образом, вы используете преимущества BeforeFieldInit
стандарта C #, но вы потеряете лень. Хотя это в некотором смысле лениво, оно не создается до того, как используется тип. Это хорошо, так как большинство синглетонов используются в любом случае, когда на них ссылаются.
public abstract class Singleton<T> where T : class, new()
{
private static readonly T _instance;
public static T Instance { get { return _instance; } }
public static Singleton()
{
_instance = new T();
}
}
Проблема публичного ctor
Теперь у вас проблема в том, что конструкция new T()
вынуждает вас иметь публичный ctor. Что не очень хорошо для одиноких. Вы можете использовать закрытый ctor, который вы вызываете через отражение, чтобы решить эту проблему.