Назад к вопросам
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()
{
// Логика метода
}
}