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