我正在尝试创建一个要在整个应用程序中使用的类的实例。
我有两种形式:form1和form2,我有一个名为Singleton1的类。
我在form1中创建了一个名为obTest的单例1实例:
Singeton1 obTest = Singleton1.Instance;
从这里我需要从form2访问变量“obTest”。是否有可能做到这一点? 如何在不创建新的Singleton1变量的情况下访问该变量?
提前致谢。
答案 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)并且懒惰地实例化。