在C#中使用Singleton

时间:2012-02-27 16:42:46

标签: c# singleton

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

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

我在form1中创建了一个名为obTest的单例1实例:

 Singeton1 obTest = Singleton1.Instance;

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

提前致谢。

8 个答案:

答案 0 :(得分:2)

为什么您担心创建对Singleton1对象的新引用?这就是单身人士的观点,你只有一个!

答案 1 :(得分: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;
        }
    }

答案 2 :(得分: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中创建的变量相同的静态引用。

希望有所帮助,

詹姆斯

答案 3 :(得分:1)

您将创建一个新变量,但它仍然只是单个对象的引用(如果您正确创建了单例)。

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

答案 4 :(得分:1)

忘记obTest变量。使用Singleton1.Instance。如果您担心产生无效结果,那么您的单例实现不正确。

答案 5 :(得分:1)

是的,假设这是 form1

中的内容
private Singeton1 obTest = Singleton1.Instance;

public Singeton1 GetSingletonInstance()
{
    return obTest;
}

然后从 form2 你可以这样做来获取单例对象而不创建新的

Singeton1 theObject = form1.GetSingletonInstance();

答案 6 :(得分:0)

如果您的Instance方法编写正确,那么您应该可以在Form2中再次调用它,并获得对Form1中创建的完全相同对象的引用。 / p>

答案 7 :(得分:0)

我不是100%确定你得到了什么,一个新的Singleton1变量(在它创建另一个单例的意义上)实际上是不可能的,通过定义Singleton应该为你的系统强制执行。一个指向单例的新变量当然是可能的,您可以根据需要指定实例。

通常,Singleton1.Instance只返回对唯一的单例实例的引用,而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)并且懒惰地实例化。