我正在尝试在整个应用程序中创建一个类的实例。在C中使用单例#
我有两种形式:form1和form2,我有一个叫做Singleton1的类。
我创建了一个名为obTest Singleton1的在Form1的实例:
Singeton1 obTest = Singleton1.Instance;
在这里,我需要从Form2的访问变量 “obTest”。是否有可能做到这一点? 如何在不创建新的Singleton1变量的情况下访问该变量?
在此先感谢。
我正在尝试在整个应用程序中创建一个类的实例。在C中使用单例#
我有两种形式:form1和form2,我有一个叫做Singleton1的类。
我创建了一个名为obTest Singleton1的在Form1的实例:
Singeton1 obTest = Singleton1.Instance;
在这里,我需要从Form2的访问变量 “obTest”。是否有可能做到这一点? 如何在不创建新的Singleton1变量的情况下访问该变量?
在此先感谢。
为什么你会为创建对象Singleton1
的新引用感到担忧?这就是Singleton的一点,你只有一个!
好吧,我明白了,正确的是在form2中创建一个名为obTest2的新变量作为Singleton1的实例。它是否正确? – Fabian 2012-02-27 17:02:08
您已经接受了答案,但是,是的,这是正确的。两者都将指向Singleton1的相同实例,假设Singleton1已正确实施。 – 2012-02-27 18:00:58
您将创建一个新变量,但它仍然只是一个参考对单身人士对象(如果您创建正确的单身人士)。
调用Singleton1.Instance
多次都会产生相同的引用,事实上,这是单例的全部目的。
现在我明白了,谢谢。 – Fabian 2012-02-27 17:18:46
像这样...你只需要确保你为你的单例类在两个表单上导入了命名空间。
注意:在这个例子中有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;
}
}
忘掉obTest
变量。使用Singleton1.Instance
。如果你担心产生无效结果,那么你的单例实现不正确。
我不是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)并且懒洋洋地实例化。
假设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中创建的变量相同的静态引用。
希望帮助,
詹姆斯
是,假设这是你的Form1中有什么
private Singeton1 obTest = Singleton1.Instance;
public Singeton1 GetSingletonInstance()
{
return obTest;
}
然后从窗口2你可以做到这一点,以获得单独的对象,而不创建一个新的
Singeton1 theObject = form1.GetSingletonInstance();
非常感谢您的回答。这是我的第一个问题,我在不到一分钟后就收到了答案! – Fabian 2012-02-27 17:22:24