Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

218
Vistas
C# Salida inesperada de una clase de patrón singleton que está creando diferentes instancias en tiempo de ejecución

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?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda