O que é um singleton em C#?

Uma pergunta muito directa.

O que é um Singleton e quando devo usá-lo?

Author: Sergio Tapia, 2010-01-28

13 answers

Um singleton é uma classe que só permite que uma instância de si mesma seja criada - e dá acesso simples e fácil a essa instância. A premissa singleton é um padrão no desenvolvimento de software.

Existe um C# implementação de "Implementação do Padrão Singleton em C#", cobrindo a maior parte do que você precisa saber - incluindo alguns bons conselhos sobre segurança do thread.

Para ser honesto, é muito raro que tenha de implementar um singleton. deve ser uma daquelas coisas que você deve estar ciente, mesmo que não seja usado com muita frequência.
 116
Author: Daniel May, 2014-04-28 09:52:46

Pediste C#. Exemplo Trivial:


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

    private static readonly Singleton _singleton = new Singleton();

    public static Singleton GetSingleton()
    {
        return _singleton;
    }
}
 43
Author: Chris Simmons, 2015-04-06 16:48:39

O que é: Uma classe para a qual há apenas uma instância persistente ao longo da vida de uma aplicação. Ver Padrão Singleton .

Quando deve usá-lo: o mínimo possível. Só quando tens a certeza absoluta de que precisas dele. Estou relutante em dizer" nunca", mas geralmente há uma alternativa melhor, como a injeção de dependência ou simplesmente uma classe estática.

 38
Author: Aaronaught, 2016-11-18 13:44:59
Outra maneira de implementar singleton em C#, Eu pessoalmente prefiro desta maneira porque você pode acessar a instância da classe singeton como uma propriedade em vez de um método.
public class Singleton
    {
        private static Singleton instance;

        private Singleton() { }

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

        //instance methods
    }
Mas, tanto quanto sei, ambos os lados são considerados "certos", por isso, é apenas uma coisa de sabor pessoal.
 23
Author: Marnix v. R., 2011-12-15 23:20:57
Um Singleton (e isto não está ligado A C#, é um padrão de design OO) é quando você quer permitir que apenas uma instância de uma classe seja criada ao longo de sua aplicação. Useages normalmente incluem recursos globais, embora eu vou dizer por experiência pessoal, eles são muitas vezes a fonte de grande dor.
 5
Author: BFree, 2010-01-28 15:43:11
Embora só possa haver uma instância de um singleton, não é a mesma que uma classe estática. Uma classe estática só pode conter métodos estáticos e nunca pode ser instanciada, enquanto a instância de um singleton pode ser usada da mesma forma que qualquer outro objeto.
 5
Author: TabbyCool, 2010-01-28 15:45:53
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();
        }
    }
}

Eu tirei o código de dofactory.com além disso, o livro de Judith Bishop sobre padrões de Design C# 3.0 tem exemplo sobre a aplicação activa no Mac dock.

Se você olhar para o código nós estamos realmente construindo novos objetos empara loop, de modo que cria um novo objeto, mas reutiliza instância como resultado de que o oldbalancer e newbalancer tem a mesma instância, como? devido a static palavra-chave usada na função GetLoadBalancer(), apesar de ter servidor diferente do valor que é lista aleatória, estática, GetLoadBalancer() pertence ao próprio tipo, em vez de um objeto específico.

Além disso, há bloqueio duplo de verificação aqui

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

Desde MSDN

A palavra-chave de bloqueio garante que um tópico não entra numa secção crítica de código enquanto outro tópico está no crítico seccao. Se outro tópico tentar introduzir um código bloqueado, ele vai esperar, bloquear, até que o objeto seja liberado.

Por isso, sempre que o bloqueio de exclusão mútua é emitido, mesmo que não seja necessário para o que é desnecessário, temos a verificação nula. Espero que ajude a limpar mais. E, por favor, comente se a minha compreensão está a dirigir caminhos errados.
 5
Author: brykneval, 2015-09-20 15:04:35
É um padrão de design e não é específico para C#. Mais sobre isso em toda a internet e assim, como neste artigo da Wikipédia .
Em Engenharia de software, os singleton padrão é um padrão de design que é usado para restringir a instanciação de um Classe A um objecto. Isto é útil. quando exatamente um objeto é necessário coordenar ações em todo o sistema. O conceito é por vezes generalizado para sistemas que operam mais eficientemente quando apenas um objecto existe, ou que restringem o instanciação a um certo número de objetos (digamos, cinco). Alguns consideram-no um anti-padrão, julgando que é excesso de uso, introduz desnecessário limitações em situações em que o linguado instância de uma classe não é realmente necessário, e introduz o estado global para uma aplicação.

Deve usá-lo se quiser uma aula que só possa ser instanciada uma vez.

 2
Author: marcgg, 2010-01-28 15:41:23
Uso-o para procurar dados. Carregar uma vez a partir de DB.
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;
        }

    }
 2
Author: Manish Jain, 2015-05-11 05:52:43

O que é um singleton :
É uma classe que só permite que uma instância de si mesma seja criada, e geralmente dá acesso simples a essa instância.

Quando Deve utilizar :
Depende da situação.

Nota : Por favor não utilize em db connection, para uma resposta detalhada por favor consulte a resposta de @Chad Grant

Aqui está um exemplo simples de um 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;
        }
    }
}

Você também pode usar Lazy<T> para criar o seu Singleton.

Veja aqui para um exemplo mais detalhado usando Lazy<T>

 2
Author: MSTdev, 2018-06-19 21:10:30
Eis o que singleton é: http://en.wikipedia.org/wiki/Singleton_pattern

Eu não sei C#, mas na verdade é a mesma coisa em todas as línguas, só que a implementação difere.

Geralmente deve evitar singleton quando é possível, mas em algumas situações é muito conveniente.

Desculpa pelo meu Inglês;)

 1
Author: radex, 2010-01-28 15:40:44

A classe Singleton é usada para criar uma única instância para todo o domínio de Aplicação.

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; }            
    }
}

Em este artigo é descrito Como podemos criar thread safe singleton class usando readonly variable e seu uso prático em aplicações.

 1
Author: Vikram, 2016-06-07 07:08:30
Singleton é um tipo de objeto remoto, que é usado para atender vários clientes. Estes objectos mantêm estados em vez de tipos de objectos de chamada singel
 -4
Author: Itsme, 2012-12-21 10:27:42