Технически ваша версия должна работать. Однако я не рекомендовал бы открывать открытое поле в вашем классе Singleton и предпочел бы использовать свойство (только с геттером). Это поможет в будущем вашему API, если вам нужно будет внести изменения позже. Я также рекомендую заклеить любую одноэлементную реализацию, так как создание подклассов одноэлементного класса почти всегда является плохой идеей и проблематичным.
Лично я бы использовал следующее в C #, если вы ориентируетесь на .NET 3.5 или более раннюю версию:
public sealed class Singleton
{
static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get
{
return instance;
}
}
static Singleton() { }
private Singleton() { }
}
Если вы используете .NET 4, вы можете сделать это еще проще для себя через 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; } }
}
Версия .NET 4 также обладает тем преимуществом, что она полностью ленива - даже если ваш класс Singleton
имеет другие статические методы, которые используются до доступа к свойству "Экземпляр" Вы также можете создать полностью ленивую версию .NET 3.5, используя закрытый вложенный класс. Джон Скит продемонстрировал это в своем блоге .