Использование статических конструкторов для создания синглтона в C # - PullRequest
1 голос
/ 15 октября 2010

Я просматривал статью о создании статических конструкторов в c # здесь:

http://csharpindepth.com/Articles/General/Singleton.aspx

Теперь, один из вариантов, который он не упоминает, - это использование простого статического конструктора.Есть ли какие-либо проблемы с выполнением чего-то подобного ниже?Если это работает, это кажется проще, чем его сложные решения. ИМХО.

public static class ServiceFactory
{
  static ServiceFactory()
  {
    container = new Foo();
  }
  static Foo container;

  public static Instance {
    get {
    return container;
    }
  }
}

Причина, по которой я спрашиваю, я делаю обзор кода и хочу оставить все как есть, если все в порядке.

Ответы [ 3 ]

3 голосов
/ 15 октября 2010

Ваш код не создает синглтон.Он создает экземпляр Foo, и, вероятно, любой другой тоже может - это означает, что он не одиночный.

Вы создали один экземпляр, на который ссылается статическая переменная в ServiceFactory, но это не одно и то же.

Если у вас нет какого-то класса, который вы ограничили, так что его может быть только один экземпляр, у вас нет синглтона.У вас может быть фабричный шаблон, кеш, что угодно - но у вас нет синглтона.

Теперь то, что вы получили, эквивалентно этому:

static Foo container = new Foo();
static ServiceFactory()
{
}

...и я не уверен, почему вы думаете, что ваша версия проще, чем выше.Если вы do действительно хотите создать синглтон, вам понадобится приватный конструктор для любого класса, который вы пытаетесь превратить в синглтон.В этот момент у вас есть мой четвертый пример, так что, опять же, я не уверен, где вы думаете, что все упрощаете.

Конечно, вам может вообще не понадобиться статический конструктор - этозависит от того, насколько точно вам нужно время.(Прочитайте мою статью о beforefieldinit для получения более подробной информации, наряду с моим сообщением в блоге об изменениях CLR v4 .)

1 голос
/ 15 октября 2010

Ваш код эквивалентен его четвертому примеру †, за исключением того, что вы используете явный конструктор класса, тогда как он инициализируется в точке объявления.

Вы должны (в большинстве случаев) избегать использования шаблона синглтона, поскольку это очень затрудняет масштабирование и модульное тестирование приложения.

† за исключением поведенческой разницы относительно того, когда синглтон создается при использовании конструкторов классов.

0 голосов
/ 15 октября 2010

Вопрос дня таков: хотите ленивый экземпляр или нет?Если вам не нужна ленивая инстанциация и вы прекрасно справляетесь с инстанцированием под нагрузкой, не стесняйтесь использовать имеющуюся у вас парадигму или даже используйте эту несколько менее многословную версию:

public static class ServiceFactory
{
    private static readonly container = new Foo();
    public static Instance { get { return container; } }
}

Оба работают отлично и отличнодействителен - до тех пор, пока вам не нужен ленивый.Если вам нужен ленивый, используйте пятую версию, указанную в статье.

...