Что такое синглтон в C#?


довольно прямой вопрос.

Что такое Синглтон и когда я должен использовать его?

13 144

13 ответов:

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

есть реализация C#"реализация шаблона Singleton в C#" охватывающих большую часть того, что вам нужно знать - в том числе некоторые хорошие советы о потокобезопасность.

честно говоря, это очень редко, что вам нужно реализовать синглтон - на мой взгляд это должна быть одна из тех вещей, которые вы должны знать, даже если это не слишком часто.

вы просили C#. Тривиальный пример:


public class Singleton
{
    private Singleton()
    {
        // Prevent outside instantiation
    }

    private static readonly Singleton _singleton = new Singleton();

    public static Singleton GetSingleton()
    {
        return _singleton;
    }
}

что это такое: класс, для которого существует только один постоянный экземпляр в течение всего времени существования приложения. Смотрите Синглтон Шаблон.

когда вы должны использовать это: Как можно меньше. Только когда ты абсолютно точно что вам это нужно. Я не хочу говорить "никогда", но обычно есть лучшая альтернатива, такая как инъекция зависимостей или просто статический класс.

другой способ реализации синглтона в c#, я лично предпочитаю этот способ, потому что вы можете получить доступ к экземпляру класса singeton как к свойству, а не к методу.

public class Singleton
    {
        private static Singleton instance;

        private Singleton() { }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();
                return instance;
            }
        }

        //instance methods
    }

но хорошо, насколько я знаю, оба способа считаются "правильными", так что это просто вещь личного вкуса.

Синглтон (и это не привязано к C#, это шаблон проектирования OO) - это когда вы хотите разрешить создание только одного экземпляра класса во всем приложении. Использование, как правило, включает в себя глобальные ресурсы, хотя я скажу из личного опыта, они очень часто являются источником большой боли.

хотя может быть только один экземпляр синглтона, это не то же самое, что статический класс. Статический класс может содержать только статические методы и никогда не может быть создан, в то время как экземпляр синглтона может использоваться таким же образом, как и любой другой объект.

using System;
using System.Collections.Generic;
class MainApp
{
    static void Main()
    {
        LoadBalancer oldbalancer = null;
        for (int i = 0; i < 15; i++)
        {
            LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer();

            if (oldbalancer == balancerNew && oldbalancer != null)
            {
                Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server);
            }
            oldbalancer = balancerNew;
        }
        Console.ReadKey();
    }
}

class LoadBalancer
{
    private static LoadBalancer _instance;
    private List<string> _servers = new List<string>();
    private Random _random = new Random();

    private static object syncLock = new object();

    private LoadBalancer()
    {
        _servers.Add("ServerI");
        _servers.Add("ServerII");
        _servers.Add("ServerIII");
        _servers.Add("ServerIV");
        _servers.Add("ServerV");
    }

    public static LoadBalancer GetLoadBalancer()
    {
        if (_instance == null)
        {
            lock (syncLock)
            {
                if (_instance == null)
                {
                    _instance = new LoadBalancer();
                }
            }
        }

        return _instance;
    }

    public string Server
    {
        get
        {
            int r = _random.Next(_servers.Count);
            return _servers[r].ToString();
        }
    }
}

Я взял код из dofactory.com, ничего особенного, но Я нахожу это гораздо лучше, чем примеры с Foo и Bar кроме того, книга от Джудит Бишоп на C# 3.0 Design Patterns имеет пример активного приложения в Mac dock.

Если вы посмотрите на код, мы на самом деле строим новые объекты на на цикл, так что создает новый объект, но повторно использует экземпляр, в результате которого oldbalancer и newbalancer имеют один и тот же экземпляр, как? его из-за статический ключевое слово, используемое в функции GetLoadBalancer (), несмотря на наличие другого значения сервера, которое является случайным списком, статическим на GetLoadBalancer () принадлежит самому типу, а не конкретному объекту.

дополнительно двойная проверка блокировки здесь

if (_instance == null)
            {
                lock (syncLock)
                {
                    if (_instance == null)

так как от MSDN

ключевое слово блокировки гарантирует, что один поток не входит в критический раздел кода, в то время как другой поток находится в критической секции. Если другой поток попытается ввести заблокированный код, он будет ждать, блокировать, пока объект не будет освобожден.

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

надеюсь, это поможет в очистке больше.

и, пожалуйста, прокомментируйте, если я мое понимание направляет неправильные пути.

это шаблон дизайна, и он не специфичен для c#. Подробнее об этом во всем интернете и так, как на этом статья в Википедии.

в программной инженерии, одноэлементный шаблон-это шаблон дизайна, который является используемый, чтобы ограничить экземпляр класс для одного объекта. Это полезно когда именно один объект необходим для координируйте действия по всей системе. Понятие иногда обобщается для систем, которые работают более эффективно когда только один объект существует, или что ограничивает создание экземпляра для определенного числа объекты (скажем, пять). Некоторые считают, что это анти-шаблон, судя по тому, что это злоупотребляет, вводит ненужное ограничения в ситуациях, когда единственным экземпляр класса на самом деле не является требуется и вводит глобальное состояние в приложение.

вы должны использовать его, если вы хотите класс, который может быть создан только один раз.

Я использую его для поиска данных. Загрузите один раз из БД.

public sealed class APILookup
    {
        private static readonly APILookup _instance = new APILookup();
        private Dictionary<string, int> _lookup;

        private APILookup()
        {
            try
            {
                _lookup = Utility.GetLookup();
            }
            catch { }
        }

        static APILookup()
        {            
        }

        public static APILookup Instance
        {
            get
            {
                return _instance;
            }
        }
        public Dictionary<string, int> GetLookup()
        {
            return _lookup;
        }

    }

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

когда вы должны использовать:
Это зависит от ситуации.

Примечание : пожалуйста, не используйте на подключение к БД, для более подробного ответа, пожалуйста см. на ответ @Chad Grant

вот простой пример Singleton:

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

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    private Singleton()
    {
    }

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

вы также можно использовать Lazy<T> создать свой Singleton.

посмотреть здесь для более подробного примера с помощью Lazy<T>

вот что такое синглтон:http://en.wikipedia.org/wiki/Singleton_pattern

Я не знаю C#, но это на самом деле то же самое на всех языках, только реализация отличается.

вы должны вообще избегать синглтон, когда это возможно, но в некоторых ситуациях это очень удобно.

извините за мой английский ;)

класс Singleton используется для создания одного экземпляра для всего домена приложения.

public class Singleton
{
    private static Singleton singletonInstance = CreateSingleton();

    private Singleton()
    {
    }

    private static Singleton CreateSingleton()
    {
        if (singletonInstance == null)
        {
            singletonInstance = new Singleton();
        }

        return singletonInstance;
    }

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

In эта статья описана как мы можем создать потокобезопасный одноэлементный класс, используя переменную readonly и их практическое использование в приложениях.

Singleton - это тип удаленного объекта, который используется для обслуживания нескольких клиентов. Эти объекты поддерживают Штаты, а не Зингель типы объектов называют