¿Qué es un singleton en C #?

Pregunta bastante directa.

¿Qué es un Singleton y cuándo debería usarlo?

Un singleton es una clase que solo permite crear una instancia de sí mismo y proporciona un acceso simple y fácil a dicha instancia. La premisa de singleton es un patrón en el desarrollo de software.

Hay una implementación de C # “Implementando el patrón Singleton en C #” que cubre la mayoría de lo que necesita saber, incluidos algunos buenos consejos sobre seguridad de hilos .

Para ser sincero, es muy raro que necesites implementar un singleton; en mi opinión, debería ser una de esas cosas de las que debes estar consciente, incluso si no se usa con demasiada frecuencia.

Usted pidió C #. Ejemplo trivial:

 public class Singleton { private Singleton() { // Prevent outside instantiation } private static readonly Singleton _singleton = new Singleton(); public static Singleton GetSingleton() { return _singleton; } } 

Qué es: una clase para la cual solo hay una instancia persistente durante toda la vida de una aplicación. Ver patrón Singleton .

Cuándo deberías usarlo: Lo menos posible. Solo cuando esté absolutamente seguro de que lo necesita. Soy reacio a decir “nunca”, pero generalmente hay una mejor alternativa, como Inyección de Dependencia o simplemente una clase estática.

Otra forma de implementar singleton en c #, personalmente lo prefiero porque puede acceder a la instancia de la clase singeton como una propiedad en lugar de un 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 } 

pero bueno, hasta donde sé, ambas formas se consideran “correctas”, por lo que es algo de sabor personal.

Un Singleton (y esto no está relacionado con C #, es un patrón de diseño OO) es cuando desea permitir que solo se cree una instancia de una clase en toda la aplicación. Los usos típicamente incluirían recursos globales, aunque diré por experiencia personal que a menudo son fuente de gran dolor.

Mientras que solo puede haber una sola instancia de singleton, no es lo mismo que una clase estática. Una clase estática solo puede contener métodos estáticos y nunca se puede crear una instancia, mientras que la instancia de un singleton se puede usar de la misma manera que cualquier otro objeto.

 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 _servers = new List(); 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(); } } } 

Tomé el código de dofactory.com , nada tan elegante, pero me parece muy bueno que los ejemplos con Foo y Bar, además, el libro de Judith Bishop en C # 3.0 Design Patterns tiene un ejemplo sobre la aplicación activa en Mac Dock.

Si nos fijamos en el código, en realidad estamos creando nuevos objetos en for loop, de modo que crea un nuevo objeto pero reutiliza la instancia, como resultado de lo cual el oldbalancer y newbalancer tienen la misma instancia, ¿cómo? es debido a la palabra clave estática utilizada en la función GetLoadBalancer () , a pesar de tener un valor de servidor diferente que es una lista aleatoria, la estática en GetLoadBalancer () pertenece al tipo en sí mismo y no a un objeto específico.

Además, hay un doble control de locking aquí

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

desde MSDN

La palabra clave de locking garantiza que un hilo no ingrese una sección crítica de código mientras otro hilo está en la sección crítica. Si otro hilo intenta ingresar un código bloqueado, esperará, bloqueará, hasta que se libere el objeto.

por lo tanto, se emite un locking mutuo de exclusión mutua, incluso si no es necesario, por lo que no es necesario, por lo que tenemos una verificación nula.

Espero que ayude a limpiar más.

Y por favor comente si mi entendimiento está dirigiendo caminos equivocados.

Es un patrón de diseño y no es específico de c #. Más sobre esto en Internet y SO, como en este artículo de Wikipedia .

En ingeniería de software, el patrón singleton es un patrón de diseño que se utiliza para restringir la creación de instancias de una clase a un objeto. Esto es útil cuando se necesita exactamente un objeto para coordinar acciones en todo el sistema. El concepto a veces se generaliza a sistemas que operan de manera más eficiente cuando existe un solo objeto, o que restringen la creación de instancias a un cierto número de objetos (por ejemplo, cinco). Algunos lo consideran un antipatrón, juzgando que se usa en exceso, introduce limitaciones innecesarias en situaciones en las que no se requiere realmente una única instancia de una clase, e introduce un estado global en una aplicación.

Debe usarlo si quiere una clase que solo puede ser instanciada una vez.

Lo uso para buscar datos. Cargue una vez desde DB.

 public sealed class APILookup { private static readonly APILookup _instance = new APILookup(); private Dictionary _lookup; private APILookup() { try { _lookup = Utility.GetLookup(); } catch { } } static APILookup() { } public static APILookup Instance { get { return _instance; } } public Dictionary GetLookup() { return _lookup; } } 

¿Qué es un singleton?
Es una clase que solo permite crear una instancia de sí mismo y, por lo general, brinda un acceso simple a esa instancia.

Cuándo deberías usar:
Depende de la situación.

Nota: no lo use en la conexión db, para obtener una respuesta detallada, consulte la respuesta de @Chad Grant

Aquí hay un ejemplo simple de 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; } } } 

También puede usar Lazy para crear su Singleton .

Vea aquí para un ejemplo más detallado usando Lazy

Esto es lo que es singleton: http://en.wikipedia.org/wiki/Singleton_pattern

No sé C #, pero en realidad es lo mismo en todos los idiomas, solo la implementación es diferente.

En general, debe evitar singleton cuando sea posible, pero en algunas situaciones es muy conveniente.

Lo siento por mi ingles 😉

La clase Singleton se usa para crear una sola instancia para todo el dominio de la aplicación.

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

En este artículo se describe cómo podemos crear una clase de singleton segura usando una variable de solo lectura y su uso práctico en las aplicaciones.

Singleton es un tipo de objeto remoto que se utiliza para dar servicio a varios clientes. Estos objetos mantienen estados en lugar de tipos de objetos de llamadas singel