Jab*_*ovo 5 c# singleton call singleton-type
我需要关于单例模式的确认。
我有一个单例类,我将它用作 dll。我编写了一个引用此 dll 的程序,并调用了我的单例类。我写了第二个程序,我也这样做。
如果我告诉你,即使我有两个程序,它们都调用我的单例类的单个实例,我对吗?
我试图增加一个静态变量 instancenumber ,每次我通过构造函数时都会增加它,两个程序都告诉我 instancenumber 是 1。所以应该没问题,但我需要你的建议来确定。
谢谢你。此致
单例类:
namespace SingletonClassLib
{
public class SingletonClass
{
public static int InstanceNumber = 0;
private static string myName;
#region //Singleton initialisation
private SingletonClass() { createInstance(); }
private void createInstance()
{
InstanceNumber++;
myName = myName + InstanceNumber.ToString();
}
public static SingletonClass _I { get { return NTCSession._i; } }
private class NTCSession
{
static NTCSession() { }
internal static readonly SingletonClass _i = new SingletonClass();
}
private static List<WeakReference> instances = new List<WeakReference>();
#endregion //Singleton initialisation
public static string askname { get { return myName; } }
}
}
Run Code Online (Sandbox Code Playgroud)
方案一:
using System.Windows.Forms;
using SingletonClassLib;
namespace Singletontest
{
public partial class Form1 : Form
{
SingletonClass myclass = SingletonClass._I;
public Form1()
{
InitializeComponent();
string Name = SingletonClass.askname;
MessageBox.Show("Program first: "+Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
方案二:
using System.Windows.Forms;
using SingletonClassLib;
namespace Singletontest
{
public partial class Form1 : Form
{
SingletonClass myclass = SingletonClass._I;
public Form1()
{
InitializeComponent();
string Name = SingletonClass.askname;
MessageBox.Show("Program second: "+Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我告诉你,即使我有两个程序,它们都调用我的单例类的单个实例,我对吗?
不,这不是它的工作原理。您的每个程序都会在其内存空间中加载 dll 的副本,因此您的每个程序都有自己的类实例。您可以启动第一个程序 5 次,启动第二个程序 3 次,这样您的班级将有 8 个实例。
他们不会共享。
如果您需要证明,只需制作它以便您可以写入实例,例如设置名称。您将看到,无论您在一个程序中做什么,其他程序都不会看到这些更改。
在应用程序之间共享数据有不同的方法,共享 dll 中的类不是其中之一,因为每个程序加载它自己的 dll 副本。