Técnicamente, su versión debería funcionar. Sin embargo, no recomendaría exponer un campo público dentro de su clase Singleton, y prefiero usar una propiedad (solo con un getter). Esto ayudará a proteger su API a futuro si necesita realizar cambios más adelante. También recomiendo sellar cualquier implementación singleton, ya que la subclase de una clase singleton es casi siempre una mala idea y problemática.
lo haría, personalmente, utilice el siguiente en C#, si está destinada a una audiencia .NET 3.5 o anterior:
public sealed class Singleton
{
static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get
{
return instance;
}
}
static Singleton() { }
private Singleton() { }
}
Si está utilizando .NET 4, usted puede hacer esto aún más fácil para usted a través de Lazy<T>
:
public sealed class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());
private Singleton() {}
public static Singleton Instance { get { return instance.Value; } }
}
la versión .NET 4 también tiene la ventaja de ser totalmente vago - incluso si su clase Singleton
tiene otros métodos estáticos que son utilizados con anterioridad al acceso de la propiedad "Instancia". También puede hacer una versión .NET 3.5 totalmente vacía, utilizando una clase anidada privada. Jon Skeet demonstrated this on his blog.
¿El constructor no se repetirá infinitamente? –
@Robert, no, la declaración 'static Class()' es para el constructor estático al que solo se llama una vez. La llamada a 'new Class()' golpea al 'constructor de instancias privado Class()'. –
Nota, hay una llamada a instancia de ctor dentro del ctor estático (inicializador de clase). – Andreas