2012-02-27 60 views
0

我正在尝试在整个应用程序中创建一个类的实例。在C中使用单例#

我有两种形式:form1和form2,我有一个叫做Singleton1的类。

我创建了一个名为obTest Singleton1的在Form1的实例:

Singeton1 obTest = Singleton1.Instance; 

在这里,我需要从Form2的访问变量 “obTest”。是否有可能做到这一点? 如何在不创建新的Singleton1变量的情况下访问该变量?

在此先感谢。

+0

非常感谢您的回答。这是我的第一个问题,我在不到一分钟后就收到了答案! – Fabian 2012-02-27 17:22:24

回答

0

如果您Instance方法编写正确,那么你应该能够在Form2再次调用它,并获得到在Form1创建完全相同的对象的引用。

+0

当你说“完全相同的对象”你引用obtest或从Singleton1新变量? – Fabian 2012-02-27 17:00:43

+1

“obTest”实际上不是一个对象,它只是对象的引用。 (具体来说,对于Singleton1的一个实例)如果你再次调用'Instance',你应该得到一个新的对同一个对象的引用。 – ean5533 2012-02-27 17:11:12

+0

我明白了,谢谢你的回答。 – Fabian 2012-02-27 17:19:23

2

为什么你会为创建对象Singleton1的新引用感到担忧?这就是Singleton的一点,你只有一个!

+0

好吧,我明白了,正确的是在form2中创建一个名为obTest2的新变量作为Singleton1的实例。它是否正确? – Fabian 2012-02-27 17:02:08

+0

您已经接受了答案,但是,是的,这是正确的。两者都将指向Singleton1的相同实例,假设Singleton1已正确实施。 – 2012-02-27 18:00:58

1

您将创建一个新变量,但它仍然只是一个参考对单身人士对象(如果您创建正确的单身人士)。

调用Singleton1.Instance多次都会产生相同的引用,事实上,这是单例的全部目的。

+0

现在我明白了,谢谢。 – Fabian 2012-02-27 17:18:46

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变量(就它创建另一个单例而言)并不是真的可行,根据定义什么是Singleton应该为你的系统强制执行。一个指向单例的新变量当然是可能的,你可以尽可能多地指向这个实例。

典型的Singleton1.Instance只返回一个引用到唯一的单例实例,而obTest只是一个引用该对象的变量。执行var x = Singleton1.Instance的开销可以在您需要的时候更快地处理实例,并且可以避免污染全局名称空间。

我会避免让static var TheInstance = Singleton1.Instance,因为Singleton1.Instance已经推测在静态范围内。

如果你需要一个好的辛格尔顿实现,这里是我的:

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; 
    } 
} 

,你可以安全地从你都Form1和Form2类调用Singleton1.Instance,因为它们都将被调用Singleton1对象的同一个实例。

如果我在form1中创建一个变量,如下所示:var oBTest = Singleton1.Instance它会给我一个引用,指向上述实现中创建的Singleton1对象的静态实例。如果我然后在form2中创建另一个变量,如下所示:var oBTestForm2 = Singleton1.Instance它也将指向与form1中创建的变量相同的静态引用。

希望帮助,

詹姆斯

+0

是的,我有正确的Singleton1.Instance实施 – Fabian 2012-02-27 17:14:52

+0

是的,我有singleton1.Instance的正确实施。所以,我明白我的思想必须专注于Singleton1.Instance而不是全局变量。 – Fabian 2012-02-27 17:17:31

+0

优秀!然后,您可以在您的两个表单中创建指向Singleton1.Instance的局部变量,并确保您正在引用每个实例中的同一个实例。合理? – 2012-02-27 17:19:13

1

是,假设这是你的Form1中有什么

private Singeton1 obTest = Singleton1.Instance; 

public Singeton1 GetSingletonInstance() 
{ 
    return obTest; 
} 

然后从窗口2你可以做到这一点,以获得单独的对象,而不创建一个新的

Singeton1 theObject = form1.GetSingletonInstance();