C# 在C中使用单例#

C# 在C中使用单例#,c#,singleton,C#,Singleton,我试图创建一个类的实例,以便在整个应用程序中使用 我有两种形式:form1和form2,我有一个叫做Singleton1的类 我在form1中创建了一个名为obTest的Singleton1实例: Singeton1 obTest = Singleton1.Instance; 从这里,我需要访问表单2中的变量“obTest”。有可能这样做吗? 如何在不创建新的Singleton1变量的情况下访问该变量 提前感谢。您为什么担心创建对Singleton1对象的新引用?这就是单身的意义,你只有一个

我试图创建一个类的实例,以便在整个应用程序中使用

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

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

 Singeton1 obTest = Singleton1.Instance;
从这里,我需要访问表单2中的变量“obTest”。有可能这样做吗? 如何在不创建新的Singleton1变量的情况下访问该变量


提前感谢。

您为什么担心创建对
Singleton1
对象的新引用?这就是单身的意义,你只有一个

您可能会创建一个新变量,但它仍然只是对singleton对象的引用(如果您正确地创建了singleton对象)


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

如果
Instance
方法编写正确,然后,您应该能够在
Form2
中再次调用它,并获得与
Form1
中创建的对象完全相同的引用,就像这样。。。您只需要确保为singleton类导入两种表单上的名称空间

注意:本例中有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;
        }
    }
//
///独生子女班
/// 
公开课考试
{
私有静态测试实例;
公共静态测试实例
{
得到
{
if(_instance==null)
{
_实例=新测试();
}
返回_实例;
}
}
公共字符串数据{get;set;}
}
/// 
///表格A
/// 
公开课形式()
{
公开形式()
{
//将一些数据放入singleton的“data”属性中
Test.Instance.Data=“value”;
}
}
/// 
///表格乙
/// 
公共类表格B()
{
公共表格b(
{
//从singleton的“data”属性获取数据
字符串值=Test.Instance.Data;
}
}

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

我不能100%确定您得到的是什么,根据单例应该为您的系统强制执行的定义,一个新的单例1变量(从创建另一个单例的意义上讲)实际上是不可能的。一个指向单例的新变量当然是可能的,您可以尽可能多地指向实例

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

我会避免使用
静态变量TheInstance=Singleton1.Instance
,因为Singleton1.Instance可能已经在静态范围内

如果您需要一个好的单例实现,下面是我的:

公共类SingletonBase,其中T:class
{
静态单碱基()
{
}
公共静态只读T实例=
typeof(T).InvokeMember(typeof(T).Name,
BindingFlags.CreateInstance|
BindingFlags.Instance|
BindingFlags.Public|
BindingFlags.NonPublic,
null,null,null)作为T;
}
声明您的Singleton1如下,您就完成了:

public class Singleton1 : SingletonBase<Singleton1> {
}
public类Singleton1:SingletonBase{
}

这是线程安全的(与大多数情况不同,包括给定的情况),并且是延迟实例化的。

假设
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中创建的变量相同的静态引用

希望有帮助


詹姆斯

是的,假设这是你的表格中的内容1

private Singeton1 obTest = Singleton1.Instance;

public Singeton1 GetSingletonInstance()
{
    return obTest;
}
然后,从form2可以执行此操作以获取单例对象,而无需创建新对象

Singeton1 theObject = form1.GetSingletonInstance();

当你说“完全相同的对象”时,你指的是obTest或Singleton1中的一个新变量,“obTest”实际上不是一个对象,它只是对一个对象的引用。(特别是针对Singleton1的实例)如果您再次调用
instance
,您应该获得对同一对象的新引用。好的,我知道正确的方法是在表单2中创建一个名为obTest2的新变量作为Singleton1的实例。这是正确的吗?你已经接受了答案,但是是的,这是正确的。假设Singleton1实现正确,两者都将指向Singleton1的同一个实例。所以,我知道我的注意力必须集中在Singleton1.Instance中,而不是一个全局变量。太好了!然后,您可以在两个表单中创建指向Singleton1.Instance的局部变量,并确保从每个表单中引用相同的实例。有意义吗?@Fabian-我不太明白你最后的评论。你说的全局变量是什么意思?非常感谢你的回答。这是我在这里的第一个问题,我是
Singeton1 theObject = form1.GetSingletonInstance();