Как создать класс, который может иметь только один экземпляр в C#

#c# #.net #singleton #design-patterns

#c# #.net #синглтон #шаблоны проектирования

Вопрос:

Интересно, существует ли механизм или шаблон, позволяющий использовать только один экземпляр класса в C #. Я слышал об Singleton классе, но я не знаю, как его правильно использовать.

Комментарии:

1. Что, если бы у меня было n экземпляров класса вместо одного? (любопытство)

Ответ №1:

Используя singleton, это класс, который позволяет создавать только один экземпляр самого себя.

 public sealed class Singleton
{
     public static readonly Singleton instance = new Singleton();
     private Singleton() {}
}
  

Работа этого шаблона проста и может быть сведена к следующему:

Скройте конструктор одноэлементного класса, чтобы не создавать экземпляры клиентов. Объявить закрытую переменную-член одноэлементного класса, содержащую ссылку на уникальный экземпляр, который мы обрабатываем. Предоставьте в классе Singleton функцию или свойство, предоставляющее доступ к тому, который поддерживается экземпляром Singleton.

Ответ №2:

это может быть пример однотонной реализации

 public sealed class CSingleTone
{
    private static CSingleTone instance;
    public int SomeValue{ get; set; }
    public static CSingleTone Instance
    {
        get
        {
            if (instance == null)
                instance = new CSingleTone();
            return instance;
        }
    }
    private CSingleTone()
    {
    }
}
  

может использоваться таким образом

 int r = CSingleTone.Instance.SomeValue;
  

Ответ №3:

Вам нужно прочитать блог нашего собственного Джона Скита (Реализация шаблона Singleton в C #).

Цель шаблона Singletom — «гарантировать, что класс имеет только один экземпляр, и предоставить глобальную точку доступа к нему».

Вот как вы можете это сделать.

 public sealed class Singleton {

    private static readonly Singleton instance = new Singleton();

    private Singleton() {       
    }

    public static Singleton Instance
    {
        get 
        {
            return instance;
        }
    }    
}
  

Комментарии:

1. А если бы у меня было не более n экземпляров класса вместо одного? (любопытство)

2. Этот ответ может предшествовать более новому синтаксису … но public static Singleton Instance { get; } = new Singleton(); поможет ли это, избегая private readonly поля?

Ответ №4:

Singleton — это не класс, а скорее шаблон. Вот пример:

 class Singleton {
    private Singleton() {}

    static private Singleton GetIt() {
        return theOne;
    }

    static private Singleton theOne = new Singleton();
}
  

Комментарии:

1. Есть ли какие-либо проблемы с MT, вызванные тем, что он недоступен только для чтения? (Здесь я не знаю.)

2. Не совсем. theOne является частным, поэтому не имеет значения.

Ответ №5:

Один из вариантов — просто объявить static класс, содержащий только static члены. Или вы можете реализовать шаблон Singleton, предоставив классу private конструктор:

 public class MySingleton
{
    public static readonly MySingleton Instance = new MySingleton();

    private MySingleton() { }

    // Members ...
}
  

Ответ №6:

вот простой пример одноэлементного класса

 class Program
{
    static void Main()
    {
    SiteStructure s = SiteStructure.Instance;
    }
}

public sealed class SiteStructure
{
    static readonly SiteStructure _instance = new SiteStructure();
    public static SiteStructure Instance
    {
    get
    {
        return _instance;
    }
    }
    SiteStructure()
    {
    // Initialize.
    }
}
  

здесь разрешено только чтение thread-safety , и это означает, что это может быть только allocated once . У него есть public static getter . Instance property Используется вызывающими для получения одноэлементного экземпляра.
Sealed известно, что компилятор позволяет выполнять специальные оптимизации во время JIT compilation . Последними описанными выше методами являются конструктор частного экземпляра и метод Initialize. Private constructors означает, что класс может only allocate itself .