Использование Singleton в C # - PullRequest
       5

Использование Singleton в C #

0 голосов
/ 27 февраля 2012

Я пытаюсь создать экземпляр класса, который будет использоваться в приложении.

У меня есть две формы: form1 и form2, и у меня есть класс с именем Singleton1.

Iсоздал экземпляр Singleton1 в form1 с именем obTest:

 Singeton1 obTest = Singleton1.Instance;

Отсюда мне нужно получить доступ к переменной "obTest" из form2.Можно ли сделать это?Как я могу получить доступ к этой переменной, не создавая новую переменную Singleton1?

Заранее спасибо.

Ответы [ 8 ]

2 голосов
/ 27 февраля 2012

Точно так же ... вам просто нужно убедиться, что вы импортировали пространство имен в обеих формах для вашего синглтон-класса.

ПРИМЕЧАНИЕ: В этом примере есть 3 класса - два изкоторые представляют ваши формы.

    /// <summary>
    /// Singleton class
    /// </summary>
    public class Test
    {
        private static Test _instance;

        public static Test Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Test();
                }

                return _instance;
            }
        }

        public string Data {get;set;}
    }

    /// <summary>
    /// Form A
    /// </summary>
    public class FormA()
    {
        public FormA()
        {
            //Put some data in the 'Data' property of the singleton
            Test.Instance.Data = "value";
        }
    }

    /// <summary>
    /// Form B
    /// </summary>
    public class FormB()
    {
        public FormB()
        {
            //Get the data form the 'Data' property of the singleton
            string value = Test.Instance.Data;
        }
    }
2 голосов
/ 27 февраля 2012

Предполагая, что Singleton1.Instance выглядит в вашей реализации следующим образом:

private static Singleton1 _instance;
public static Singleton1 Instance {
    get {
        if(_instance == null)
            _instance = new Singleton1();

        return _instance;
    }
}

вы можете безопасно вызывать Singleton1.Instance из ваших классов form1 и form2, так как они оба будут вызывать один и тот же экземпляр объекта Singleton1.

Если я создам переменную в form1 следующим образом: var oBTest = Singleton1.Instance, она даст мне ссылку, которая будет указывать на статический экземпляр объекта Singleton1, созданного в приведенной выше реализации. Если я затем создам другую переменную в form2, например: var oBTestForm2 = Singleton1.Instance, она также будет указывать на ту же статическую ссылку, что и переменная, созданная в form1.

Надеюсь, это поможет,

Джеймс

2 голосов
/ 27 февраля 2012

Почему вы беспокоитесь о создании новой ссылки на объект Singleton1?В этом смысл Singleton, что у вас есть только один!

1 голос
/ 27 февраля 2012

Да, при условии, что это то, что находится в вашем form1

private Singeton1 obTest = Singleton1.Instance;

public Singeton1 GetSingletonInstance()
{
    return obTest;
}

, затем из form2 вы можете сделать это, чтобы получить объект singleton без создания нового.

Singeton1 theObject = form1.GetSingletonInstance();
1 голос
/ 27 февраля 2012

Забудьте переменную obTest.Используйте Singleton1.Instance.Если вы беспокоитесь о получении неверных результатов, то ваш синглтон реализован неправильно.

1 голос
/ 27 февраля 2012

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

Вызов Singleton1.Instance несколько раз приведёт к одной и той же ссылке, на самом деле, в этом и заключается единственная цель.

0 голосов
/ 27 февраля 2012

Я не уверен на 100%, к чему вы клоните, новая переменная Singleton1 (в том смысле, что она создает другой синглтон) на самом деле невозможна по определению того, что Singleton должен применять для вашей системы.Новая переменная, которая указывает на синглтон, безусловно, возможна, вы можете сделать столько, сколько хотите указать на экземпляр.

Обычно Singleton1.Instance просто возвращает ссылки на один-единственный экземпляр синглтона, и obTestэто просто переменная, которая ссылается на этот объект.Затраты на выполнение var x = Singleton1.Instance для более быстрой обработки экземпляра в любое время, когда он вам нужен, минимальны и не допускают загрязнения глобального пространства имен.

Я бы не стал делать static var TheInstance = Singleton1.Instance, поскольку Singleton1.Экземпляр уже предположительно находится в статической области видимости.

Если вам нужна хорошая реализация Singleton, вот мой:

https://stackoverflow.com/a/1010662/18255

public class SingletonBase<T> where T : class
{
    static SingletonBase()
    {
    }

    public static readonly T Instance = 
        typeof(T).InvokeMember(typeof(T).Name, 
                                BindingFlags.CreateInstance | 
                                BindingFlags.Instance |
                                BindingFlags.Public |
                                BindingFlags.NonPublic, 
                                null, null, null) as T;
}

Объявите ваш Singleton1 как этот, и высделано:

public class Singleton1 : SingletonBase<Singleton1> {
}

Это поточно-ориентированный (в отличие от большинства, включая тот, который указан здесь ) и ленивый экземпляр.

0 голосов
/ 27 февраля 2012

Если ваш метод Instance написан правильно, вы сможете снова вызвать его в Form2 и получить ссылку на точно такой же объект, который был создан в Form1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...