Estoy aprendiendo patrones de diseño. Creé una clase Logger singleton que debería devolver una nueva instancia de logger solo si es nulo, y devolver la misma instancia cada vez que lo haga. Pero implementar la clase da como resultado la creación de una nueva instancia cada vez.
public class Logger { private Logger() { } private static Logger instance; public static Logger Instance { get { return instance == null ? new Logger() : instance; } } } static void Main () { Logger log1 = Logger.Instance; Logger log2 = Logger.Instance; Console.WriteLine(log1.GetHashCode()); Console.WriteLine(log2.GetHashCode()); }Se supone que el código hash resultante es el mismo en ambas líneas, pero no lo es. ¿Porqué es eso?
public static Logger Instance { get { return instance == null ? new Logger() : instance; // You do not _set_ 'instance' ! } }Entonces, esto debería ser más como
public static Logger Instance { get { if( instance is null ) instance = new Logger(); return instance; } }Tenga en cuenta que esto no es seguro para subprocesos .
Sobre la implementación correcta y segura de Singletons, hay muchos artículos escritos por personas que pueden hacerlo mejor que yo. Te sugiero que explores eso un poco.
debe inicializar el campo "instancia" con la nueva instancia del registrador antes de devolverlo o siempre será nulo.
if (instance == null) { instance = new Logger(); } return instance;también puedes usar una sola expresión
return instance == null ? (instance = new Logger()) : instance;
Nota: en un entorno de subprocesos múltiples, debe usar un bloqueo u otras sincronizaciones