Метод C# Singleton "GetInstance" или свойство “экземпляра”?

В меню Nautilus обычно нет удаления. Необходимо активироваться, удаляют путем входа в редактирование наутилуса-> предпочтения-> поведение.

8
задан H A 28 April 2015 в 23:58
поделиться

7 ответов

В C # я бы предпочел .Instance , поскольку он соответствует общим рекомендациям.

16
ответ дан 5 December 2019 в 04:52
поделиться

Если вы хотите создать синглтон, вы не можете просто возвращать новый объект при каждом вызове GetInstance или Instance средства получения свойства. Вы должны сделать что-то вроде этого:

public sealed class Bar
{
    private Bar() { }

    // this will be initialized only once
    private static Bar instance = new Bar();

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return instance;
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return instance;
    }
}

И неважно, какой путь вы выберете. Если вы предпочитаете работать со свойствами, выберите его, если вы предпочитаете методы, это тоже подойдет.

14
ответ дан 5 December 2019 в 04:52
поделиться

Как и практически все, это зависит:)

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

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

4
ответ дан 5 December 2019 в 04:52
поделиться

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

3
ответ дан 5 December 2019 в 04:52
поделиться

Я предпочитаю собственность, это стандартные шаблоны.

0
ответ дан 5 December 2019 в 04:52
поделиться

Как сказал @Rex, это зависит от семантики, которую вы хотите передать.

GetInstance () не обязательно подразумевает одноэлементный экземпляр. Итак, я бы использовал GetInstance () в случае, когда создание экземпляра происходит по запросу, прямое создание нежелательно, и экземпляр может быть таким же, но не гарантируется, что он будет таким же. Пулы объектов также соответствуют этим критериям. (Фактически, синглтон - это специализация пула объектов с сохранением состояния: -))

Свойство Static Instance, с другой стороны, подразумевает одноэлементный и сохраненный идентификатор экземпляра.

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

0
ответ дан 5 December 2019 в 04:52
поделиться
public class Singleton
{

    private volatile static Singleton uniqueInstance;
    private static readonly object padlock = new object();

    private Singleton() { }

    public static Singleton getInstance()
    {
        if (uniqueInstance == null)
        {
            lock (padlock)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

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

                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }

, если экземпляр равен нулю, создайте его.

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

2
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: