2012-02-27 3 views
0

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

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

Я создал экземпляр Singleton1 в form1 под названием заклинать:

Singeton1 obTest = Singleton1.Instance; 

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

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

+0

Большое спасибо за ответы. Это мой первый вопрос, и я получил ответы спустя менее минуты! – Fabian

ответ

0

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

+0

Когда вы говорите «тот же самый объект», вы ссылаетесь на obTest или новую переменную от Singleton1? – Fabian

+1

«obTest» на самом деле не объект, это просто ссылка на объект. (В частности, к экземпляру Singleton1) Если вы снова вызываете «Экземпляр», вам следует получить новую ссылку на тот же объект. – ean5533

+0

Я понимаю, спасибо за ваш ответ. – Fabian

2

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

+0

Итак, я понимаю, что правильно создать новую переменную с именем obTest2 в форме2 как экземпляр Singleton1. Это верно? – Fabian

+0

Вы уже приняли ответ, но да, это правильно. Оба будут указывать на тот же экземпляр Singleton1, предполагая, что Singleton1 реализован правильно. –

1

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

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

+0

Теперь я понимаю, спасибо. – Fabian

2

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

ПРИМЕЧАНИЕ: В этом примере есть 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; 
     } 
    } 
1

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

0

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

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

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

Если вам нужна хорошая реализация 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> { 
} 

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

2

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

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

     return _instance; 
    } 
} 

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

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

Надежда, что помогает,

Джеймс

+0

Да, у меня есть правильная реализация Singleton1.Instance – Fabian

+0

Да, у меня есть правильная реализация singleton1.Instance. Итак, я понимаю, что мой ум должен быть сосредоточен в Singleton1.Instance вместо глобальной переменной. – Fabian

+0

Отлично! Затем вы можете создавать локальные переменные в двух формах, которые указывают на Singleton1.Instance, и убедитесь, что вы ссылаетесь на один и тот же экземпляр из каждого. Имеют смысл? –

1

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

private Singeton1 obTest = Singleton1.Instance; 

public Singeton1 GetSingletonInstance() 
{ 
    return obTest; 
} 

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

Singeton1 theObject = form1.GetSingletonInstance(); 
Смежные вопросы