Назад к вопросам
Middle
132
questionbank

Как реализовать паттерн Singleton в C#?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Самый простой и распространённый способ — использование публичного статического свойства с ленивой инициализацией.

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object lockObject = new object();

    // Приватный конструктор для предотвращения создания экземпляров извне
    private Singleton()
    {
    }

    // Публичное статическое свойство для получения единственного экземпляра
    public static Singleton Instance
    {
        get
        {
            // Двойная проверка блокировки для потокобезопасности
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    // Дополнительные методы и свойства класса
    public void SomeMethod()
    {
        // Логика метода
    }
}

Другой вариант — с использованием статического конструктора и Eager Initialization:

public sealed class Singleton
{
    // Экземпляр создается при инициализации типа
    private static readonly Singleton instance = new Singleton();

    // Приватный конструктор
    private Singleton()
    {
    }

    // Публичное статическое свойство
    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }

    // Дополнительные методы и свойства
    public void SomeMethod()
    {
        // Логика метода
    }
}

С использованием Lazy<T> для ленивой и потокобезопасной инициализации:

public sealed class Singleton
{
    // Lazy<T> обеспечивает потокобезопасную ленивую инициализацию
    private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());

    // Приватный конструктор
    private Singleton()
    {
    }

    // Публичное статическое свойство
    public static Singleton Instance
    {
        get
        {
            return lazyInstance.Value;
        }
    }

    // Дополнительные методы и свойства
    public void SomeMethod()
    {
        // Логика метода
    }
}