Эта одноэлементная реализация корректна и ориентирована на многопотоковое исполнение?
class Class
{
public static readonly Class Instance;
static Class()
{
Instance = new Class();
}
private Class() {}
}
Технически ваша версия должна работать. Однако я бы не рекомендовал раскрывать общедоступное поле в вашем классе 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
:
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, используя частный вложенный класс. Джон Скит продемонстрировал это в своем блоге .
Да. Я бы также сделал класс « запечатанным
», чтобы избежать путаницы в будущем.
Хорошее обсуждение того, как это сделать, находится здесь:
Вы должны выполнить инициализацию в объявлении переменной:
public static readonly Class Instance = new Class();